2016-08-01 65 views
3

我可以從一個指定到一個動作(其預計返回類型爲void)拉姆達調用非void函數:分配給void delegate的lambdas放棄C#中的非void返回類型嗎?

static bool foo() { return true; } 
... 
// Action action = foo; // This gives a compile error though. 
Action action =()=>foo(); // This compiles 

起初,我注意到了這一點,而在尋找的List.ForEach()一個例子。我可以從lambda執行一個非void函數並編譯它。

起初,這看起來是違反直覺的,並且讓我覺得你可以爲void委託(無效行爲就像一種反變形)分配非無效函數,但Action action = foo;不起作用。

所以現在我假設發生的事情是,lambda變成void,因爲這是期望的返回類型,所以它放棄了它所調用的非void函數的返回類型。那是對的嗎?

回答

3

你的榜樣

Action action =()=>foo(); 

就像任何其他的方法:

public void MyTestMethod() 
{ 
    // do something 
    foo(); 
    // do some more 
} 

這是在C#中完全合法的(儘管一些靜態分析儀會警告你,你不要用foo()的返回值)。

第二個例子:

action = foo; 

不起作用,因爲foo本身是具有返回類型的方法及其只能分配給Func<bool>類型的變量,而不是Action。另一方面,λ() => foo()沒有返回類型,並且是有效的Action

+0

是的,這是有道理的。我想這只是數學上的符號'x => f(x)',乍一看使它看起來不符合直覺。謝謝。 – sashoalm

2

那麼,在這行代碼:

Action action =()=> foo(); // This compiles 

實際上,你可以創建運行使用closure你的函數的另一種方法:

void AnonymousMethod() 
{ 
    foo(); 
} 

要指定其他方法來委託調用方法foo與分配foo方法直接進行委派並不相同。這就是爲什麼行代碼:

Action action = foo; 

不會編譯,因爲Action委託具有返回void類型和方法foo沒有。

相關問題