分配给void委托的lambda会丢弃C#中的非void返回类型吗?

时间:2016-08-01 09:01:16

标签: c# lambda void

我可以从分配给Action的lambda调用一个非void函数(它需要一个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函数的返回类型。这是对的吗?

2 个答案:

答案 0 :(得分:3)

你的例子

Action action = ()=>foo();

就像任何其他方法一样:

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

这在C#中完全合法(虽然一些静态分析器会警告你不要使用foo()的返回值。)

第二个例子:

action = foo;

不起作用,因为foo本身是一个具有返回类型的方法,因此只能分配给Func<bool>类型的变量,而不能分配给Action。另一方面,lambda () => foo()没有返回类型,并且是有效的Action

答案 1 :(得分:2)

嗯,在这行代码中:

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

您实际上是使用 closure 创建另一个运行您的功能的方法:

void AnonymousMethod()
{
   foo();
}

将另一个方法分配给调用方法foo的委托与分配foo方法直接委派的方法不同。这就是代码行的原因:

Action action = foo;

将无法编译,因为Action委托的返回类型为void,方法foo没有。