Lambda Expression返回类型问题

时间:2016-07-06 21:41:55

标签: c# lambda

为什么第一个和第三个表达式有效但不是第二个?

        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

2 个答案:

答案 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#是强类型的,因此对于intFunc期望值类型为int