[英]Is it possible to compile a C# method that has non-void return type, but does not return a value?
[英]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.