如果我有一個lambda如() => { throw new Exception(); }
,目前還不清楚它是否有返回類型或沒有。正因爲如此,它可以是(隱式地)轉換爲兩個Action
和Func<object>
(或任何其它Func<T>
)。這是因爲,根據§6.5匿名功能轉換的C#4規範的:LAMBDA轉換不清的返回類型和重載決議
[A]委託類型
D
是與設置一個匿名函數F
兼容:
...
如果
D
有一個void
返回類型,並且F
的主體是語句塊,當的主體10是一個有效的語句塊,其中沒有return語句指定表達式。如果
D
具有非void返回類型和F
主體是一個語句塊,當[...]的F
主體是具有非可到達終點的有效語句塊,其中每個return
語句指定可隱式轉換到的D
返回類型的表達式。
但是,如果我有一個方法,其中,一個具有Action
類型和其他Func<object>
的參數的兩個重載,我通過它從上面的拉姆達,則使用Func<object>
過載。爲什麼?其規範的一部分,說Func<object>
比在這種情況下Action
更好?
我已經看過§7.5.3.2更好的功能成員,但這並不能解釋它。
而如果代替lambda語法,你用符號'委託{拋出新的異常(); }'在'(')'括號中省略參數列表,那個匿名函數可以匹配**我猜想的任何**委託簽名,包括例如'EventHandler'和'Action
@JeppeStigNielsen是的。在這種情況下,確實沒有規則可以將它們作爲方法參數消除歧義,所以你會得到一個編譯錯誤。 – svick 2012-08-13 20:59:52