c#中的lambda表达式和var关键字

时间:2011-08-01 11:16:13

标签: c# lambda

  

可能重复:
  C# Why can't an anonymous method be assigned to var?

我在c#

中有以下声明
Func <int, int, int> add = (x, y) => x + y;

但是当我用下面的

替换左手边的声明时
var add = (x, y) => x + y;

我收到编译器错误(无法将lambda表达式分配给隐式类型的局部变量)。为什么?

3 个答案:

答案 0 :(得分:16)

因为编译器无法确定RHS的类型

var add = (x, y) => x + y;

支持+运算符的任何类型都是候选者,因为x和y的类型不是相同类型的约束。有许多可能使用的+运算符退出,因此x和y的可能类型集相当大但是为了能够确定add的类型,编译器需要能够减少设置为x的一个类型和y的一个类型(不完全正确,可能是基类和派生类都适合),即使编译器可以计算出x和y的类型或者你指定的类型让你说int的类型你仍然会留下这两个事实 Expression<Func<int,int,int>>Func<int,int,int>是可能的添加类型

如何减少可能的类型集有多种选择。编译器可以尝试查看以后如何使用add但是没有(并且可能无法计算出类型,即使它已经完成)

答案 1 :(得分:12)

var关键字不起作用,因为lambda表达式作为表达式树用于两个委托,并且编译器不知道它应该转换为lambda。换句话说,以下类型对您的(x, y) => x + y lambda有效:Func<int, int, int>Expression<Func<int, int, int>>

答案 2 :(得分:1)

您得到的错误是因为编译器不知道x和y是什么类型。