2016-07-06 170 views
0

为什么第一个和第三个表达式工作但不是第二个?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 
+5

你基本上试图把'Func '放在一个类型为int的变量中;有一些错误;) – Sehnsucht

+0

'int x1 = new Func (()=> 0)();'会工作,因为您然后调用函数表达式,得到0结果,然后将其分配给int。尽管如此,这与返回值并没有多大关系,并且要注意,第一个作品是因为您可以将任何内容分配给var。第三个原因是因为您再次调用函数表达式(特别是使用字符串,因为它期望)。 –

+0

@TravisJ我们不能把任何东西放在'var'; “只”的类型可以(静态地)从表达式中解析出来。例如'var foo = delegate(){return 0; };'不起作用 – Sehnsucht

回答

8

随着

var ss = new Func<int>(() => 0); 

编译器能够正确地推断出实际类型的ssFunc<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

现在更有意义了吗?

+0

是的!这是我不理解的调用部分。那么,最简​​洁的方法是:int x1 = new Func (()=> 0)();分配有两部分 - lambda表达式,然后调用它,这是实际执行func.and返回我需要返回的。 非常感谢。 – Chris

0

你有没有尝试添加的返回类型的函数功能,像这样,

int x1 = new Func<int, int>(() =<0); 

你会发现,这也将返回相同的错误。

var的工作原理是因为var的值对于类型无关紧要。 C#是强类型的,因此对于intFunc预期的值类型为int