2012-08-14 63 views
2

我很困惑,爲什麼這個工程:爲什麼我可以將不兼容的lambda分配給Action?

Action myAction1 =() => myIntFunc(); 
... 
private Int32 myIntFunc() { 
    return(4); 
    } 

我希望編譯器不允許這樣做,因爲動作表示不返回參數的功能,但顯然myIntFunc返回的參數。

至於進一步的證據,注意,這不工作:

Action myAction2 = myIntFunc; 

所以它就像lambda語法是讓我逃脫的東西我不應該能逃脫。我猜想我忽略了Actions和lambdas如何一起工作......?

回答

0

C# language specification,第6.5款,子彈的人說:如果D有一個void返回類型並且F的主體是一個表達式,那麼當F的每個參數都給出D中相應參數的類型時,F的主體是一個有效表達式(wrt§7),它將被允許作爲一個聲明表達式(§8.6)。

所以在這種情況下扔掉返回值是可以的。

對於方法組轉換,請參閱第6.6段。然後該方法必須兼容包括的返回類型。

所以匿名方法(lambda)和正常(named)方法(或方法組)之間是有區別的。

2

我認爲它,當你做到這一點比同:

myIntFunc(); 

忽略方法的結果。

1

明確允許您試圖執行的操作。每對Action代表的MSDN文檔(強調):

封裝的方法必須有沒有參數和返回值。 (。在C#中,該方法必須返回void [...] 它也可以是一個返回被忽略值的方法

相關問題