簡體   English   中英

分配給void委托的lambda會丟棄C#中的非void返回類型嗎?

[英]Do lambdas assigned to void delegate discard non-void return type in C#?

我可以從一個lambda調用一個非void函數,該lambda被賦值給一個Action(它需要一個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委托(void表現得像一種逆變),但Action action = foo; 沒用。

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

你的榜樣

Action action = ()=>foo();

就像任何其他方法一樣:

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

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

第二個例子:

action = foo;

不起作用,因為foo本身是一個返回類型的方法,因此只能分配給Func<bool>類型的變量,而不能分配給Action 另一方面,lambda () => foo()沒有返回類型,是一個有效的Action

好吧,在這行代碼中:

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

您實際上創建了另一個使用閉包運行函數的方法:

void AnonymousMethod()
{
   foo();
}

將另一個方法分配給調用方法foo的委托與分配foo方法直接委派不同。 這就是為什么代碼行:

Action action = foo;

不會編譯,因為Action委托有返回類型的void而方法foo沒有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM