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

san*_*ngh 26 c# lambda

可能重复:
C#为什么不能将匿名方法分配给var?

我在c#中有以下声明

Func <int, int, int> add = (x, y) => x + y;
Run Code Online (Sandbox Code Playgroud)

但是当我用以下代替左手边的声明时

var add = (x, y) => x + y;
Run Code Online (Sandbox Code Playgroud)

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

Run*_* FS 16

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

var add = (x, y) => x + y;
Run Code Online (Sandbox Code Playgroud)

支持+运算符的任何类型都是候选者,因为x和y的类型不是相同类型的约束.有很多可能的+运算符可以使用,因此x和y的可能类型集相当大但是为了能够确定add的类型,编译器需要能够将set减少到只有一种类型对于x和一个用于y(不完全正确,可能是基类和派生类都适合)并且即使编译器可以找出x和y的类型,或者你指定类型让我们说int你仍然会留下事实上,这两个 Expression<Func<int,int,int>>Func<int,int,int>可能的类型为附加

如何减少可能类型集有多种选择.编译器可能会尝试查看add以后如何使用但不会(并且可能无法计算类型,即使它确实如此)

  • 作为附录,您可以告诉编译器`var add =(Func <int,int,int>)((x,y)=> x + y);`但是这并没有真正获得任何东西你也可以将功能放在LHS上! (2认同)

Ste*_*ven 12

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