我可以从一个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函数的返回类型 . 那是对的吗?
2 回答
好吧,在这行代码中:
您实际上创建了另一个使用closure运行函数的方法:
将另一个方法分配给调用方法
foo
的委托与分配foo
方法直接委派不同 . 这就是为什么代码行:不会编译,因为
Action
委托的返回类型为void,而方法foo
则没有 .你的榜样
就像任何其他方法一样:
这在C#中是完全合法的(虽然一些静态分析器会警告你不要使用
foo()
的返回值) .第二个例子:
不起作用,因为
foo
本身是一个具有返回类型的方法,因此只能分配给Func<bool>
类型的变量,而不能分配给Action
. 另一方面,lambda() => foo()
没有返回类型,并且是有效的Action
.