为什么第一个和第三个表达式有效但不是第二个?
var ss = new Func<int>(() => 0); //works
int x1 = new Func<int>(() => 0); //doesn't work --Cannot convert source type 'System.Func<int>' to target type 'int'
int x2 = new Func<string,int>((x) => 0)(""); //works
答案 0 :(得分:9)
使用
var ss = new Func<int>(() => 0);
编译器能够正确推断ss
的实际类型为Func<int>
。 Func<int>
是一个可以调用并返回int
的委托。所以:
ss() == 0 // is true
请注意,我们必须在此处调用ss
(例如ss()
)才能返回 int
。
因此,知道我们从上面做了什么,以下不可能是正确的
int x1 = new Func<int>(() => 0);
因为您现在正在尝试将函数/委托(与前一个相同)存储到类型为int
的变量中。它是Func<int>
类型的委托......与int
非常不同,在调用/调用时,返回 int
。
在这种情况下
int x2 = new Func<string,int>((x) => 0)("");
您正在声明一个函数,该函数将字符串作为参数并返回int
,然后立即调用它(提供未使用的空字符串,""
作为参数)。然后,该函数返回int
,然后将其存储为x2
。
现在更有意义吗?
答案 1 :(得分:0)
您是否尝试为Func添加返回类型,如此,
int x1 = new Func<int, int>(() =<0);
您会注意到,这也会返回相同的错误。
var
有效,因为var
的值与类型无关。 C#是强类型的,因此对于int
,Func
期望值类型为int
。