我可以从分配给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函数的返回类型。这是对的吗?
答案 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
没有。