2017-03-02 19 views
5

撓撓我的腦袋。以下陳述有什麼問題?爲什麼編譯器在這種情況下無法確定操作數的類型?

var EncFunc = (encrypt ? Encryption.Encrypt : Encryption.Decrypt); 

encryptbool,兩者的功能Encryption.EncryptEncryption.Decrypt具有相同類型的Func<string, string>,但它告訴我,:無法確定條件表達式

CS0173型,因爲沒有隱式轉換'方法組'和'方法組'之間

我已經通過了thisthis,但無法理解爲什麼編譯器無法確定這2個函數的類型。

N.B.我知道這可以通過明確的轉換來解決。我對理解「爲什麼」部分更感興趣。

+0

May [this](https://msdn.microsoft.com/en-us/library/hb47kt2f.aspx)help?但我想你已經讀過了。所以我猜[這](http://stackoverflow.com/questions/2215745/conditional-operator-cannot-cast-implicitly/2215959#2215959)是可能重複的問題和答案。 – ckruczek

+0

@ckruczek:謝謝。這是一個很好的閱讀。但它沒有解決這種情況。類型信息流出RHS,而不是流入它,因爲LHS是推斷的。 – dotNET

+0

我認爲這個問題可以簡單地作爲,你不能這樣做「var encFunc = Encryption.Encrypt;」,但你可以做到這一點「Func encFunc = Encryption.Encrypt;」。爲什麼是這樣,不幸的是我不知道......我也想知道爲什麼它有麻煩檢測到足夠的隱式轉換爲委託。 –

回答

6

我認爲以下解釋了爲什麼編譯器有這個困難。 比方說,我們有:

string MyMethod() { return ""; } 

我們不能把方法分配給var,換句話說,我們不能用這樣的:

// Not valid. 
var method = MyMethod; 

這是因爲有可能是任何數量的代表,可以用來,例如:

delegate string MyDelegate(); 

有了這個,我們現在有兩個選擇,似乎,這將是錯誤的編譯器採用一個比OTH ER:

// Valid. 
Func<string> myFunc = MyMethod; 

// Valid. 
MyDelegate myDel = MyMethod; 

編輯:完成的緣故,我加入一個參考this(它是由OP在評論中提到的)。

+0

很對。謝謝一堆。 – dotNET

相關問題