我通过立即附加"()"来定义一个lambda并调用它。
尝试:
int i = (() => 0) ();
错误:
错误CS0119:表达式表示
anonymous method', where a
方法组'预计
为什么?
答案 0 :(得分:13)
你不是" 定义一个lambda " ..你围绕你认为的那个包围括号。
编译器没有推断出这种类型的东西。它需要背景。您可以通过将lambda的表示形式分配或转换为委托类型来为其提供上下文:
Func<int> f = () => 0;
int i = f();
这是明确的背景。如果你想要一个不清楚的......这种事情也有效:
int i = ((Func<int>)(() => 0))();
答案 1 :(得分:7)
lambda不支持被执行。代表支持被执行。 lambda表达式可以隐式转换为委托类型。如果没有请求这样的转换,则没有“默认”委托类型。从.NET 2开始,我们通常会将Action
和Func
用于所有内容,但我们可以使用不同的委托类型。
首先转换为委托,然后执行:
((Func<int>)(() => 0))()
有人可能会争辩说,如果没有其他请求,C#应默认使用Action
和Func
。从C#5开始,该语言不会这样做。