2011-05-16 90 views
20

我已經看到類似的問題,但它們涉及不同的類型,所以我認爲這是一個新問題。爲什麼「Func <bool> test = value?F:F」沒有編譯?

考慮下面的代碼:

public void Test(bool value) 
{ 
    // The following line provokes a compiler error: 
    // "Type of conditional expression cannot be determined because there is 
    // no implicit conversion between 'method group' and 'method group". 

    Func<bool> test = value ? F : F; 
} 

public bool F() 
{ 
    return false; 
} 

現在,根據C#3.0標準,

的 的第二和第三運算數:操作員控制的 條件表達式的類型。令X和Y爲 操作數的第二個和第三個 的類型。然後,

如果X和Y是相同的類型,則這 是條件 的類型否則,如果(第6.1節)從X存在於Y的隱式轉換 ,但不是 從Y到X,那麼Y是 條件表達式的類型。否則,如果 隱式轉換(第6.1節)存在 從Y到X,但不從X到Y,則 X是條件式 表達式的類型。否則,不能確定表達式 ,並且發生編譯時錯誤 。

在我看來,在我的示例代碼中,X和Y必須是同一類型的,因爲它們是完全一樣的實體,Func鍵。那爲什麼不編譯?

+0

我不知道,但你能解釋你怎麼能寫一個方法名稱與void返回類型像這樣在表達式'Func' ?? – 2011-05-16 10:04:55

+0

對不起,爲了簡化我原來的代碼中的代碼,我錯誤地刪除了返回類型。我現在修好了! – 2011-05-16 10:14:47

回答

12

這個問題已經發生了很大的變化,所以我原來的答案現在有點偏離。

但是,問題本質上是一樣的。即F可以有任意數量的匹配委託聲明,並且由於兩個相同的委託聲明之間沒有隱式轉換,所以F的類型不能轉換爲Func<bool>

同樣,如果聲明

private delegate void X(); 
private delegate void Y(); 
private static void Foo() {} 

你不能這樣做

X x = Foo; 
Y y = x; 

原來的答覆:

它不工作,因爲方法組不能被分配到一個隱類型變量。

var test = Func;也不起作用。

原因是可能有任何數量的委託類型Func。例如。 Func比賽這兩個聲明的(除了Action

private delegate void X(); 
private delegate void Y(); 

要使用與方法組隱式類型變量,則需要通過轉換成消除不確定性。


archil's answer爲解決這一問題的一種方式一個具體例子。也就是說,他顯示了更正後的代碼可能看起來像[假設您希望匹配的代表是Action]。

+0

但是,即使您明確指定了測試變量的類型爲:public delegate void FuncDelegate();這條線仍然不會工作: FuncDelegate funcDelegate = value? Func:Func; 爲什麼? – 2011-05-16 10:14:25

+0

我已經修復了我的示例以匹配我在原始代碼中的內容;當我第一次在這裏發佈時,我簡化了它。 – 2011-05-16 10:16:11

+0

我改變了我的代碼,以便不再分配給一個隱式類型的變量。 – 2011-05-16 10:17:20

8
var test = value ? (Action)Func: (Action)Func; 

實際上,type的方法是通過委託來表示它匹配的。我用來投射方法的System.Action是簽名返回void且不帶參數的委託 - 它與您的Func()方法相匹配。現在你的test會知道它是System.Action的類型。代表就像方法的接口。看看http://msdn.microsoft.com/en-us/library/ms173171(v=vs.80).aspx

+0

有趣,但爲什麼'價值? (Action)f:g;'和'value? f:(Action)g;'都編譯? – 2016-04-26 17:58:32

+0

@MateenUlhaq - 因爲當你給所需的*簽名*(行動)到任一半時,編譯器知道期望的目標是什麼。然後它可以確定另一半是否可以轉換成相同的簽名。 – ToolmakerSteve 2017-04-11 01:20:58

相關問題