分配给 void delegate 的 lambda 会丢弃 C# 中的非 void return 类型吗?

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

我可以从分配给 Action(需要 void return 类型)的 lambda 中调用非 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 因为那是预期的 return 类型,所以它丢弃它调用的非 void 函数的 return 类型。对吗?

你的例子

Action action = ()=>foo();

就像任何其他方法一样:

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

这在 C# 中是完全合法的(尽管一些静态分析器会警告您不要使用 foo() 的 return 值)。

第二个例子:

action = foo;

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

嗯,在这行代码中:

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

您实际上使用 closure 创建了另一个运行函数的方法:

void AnonymousMethod()
{
   foo();
}

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

Action action = foo;

不会编译,因为 Action 委托有 return 类型的 void 而方法 foo 没有。