Lambda Expression返回类型问题

Chr*_*ris 0 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
Run Code Online (Sandbox Code Playgroud)

spe*_*der 9

var ss = new Func<int>(() => 0);
Run Code Online (Sandbox Code Playgroud)

编译器能够正确地推断出实际类型ssFunc<int>.Func<int>是一个可以调用并返回的委托int.所以:

ss() == 0 // is true
Run Code Online (Sandbox Code Playgroud)

请注意,我们必须在ss这里调用(例如ss())以便它返回一个int.

因此,知道我们从上面做什么,以下是不对的

int x1 = new Func<int>(() => 0);
Run Code Online (Sandbox Code Playgroud)

因为您现在正在尝试将函数/委托(与前一个相同)存储到键入的变量中int.它是一个类型的委托Func<int>......与a 非常不同int,它是在调用/调用时返回的东西int.

在这种情况下

int x2 = new Func<string,int>((x) => 0)("");
Run Code Online (Sandbox Code Playgroud)

你声明一个函数,它接受一个字符串作为参数并返回一个函数int,然后立即调用它(提供一个未使用的空字符串""作为参数).然后该函数返回int您随后存储的函数x2.

现在更有意义吗?