c#中的lambda表达式和var关键字
可能重复:
C#为什么不能将匿名方法分配给var?
我在c#中有以下声明
Func add = (x, y) => x + y;
但是当我用以下代替左手边的声明时
var add = (x, y) => x + y;
我收到编译错误( 无法将lambda表达式赋值给隐式类型的局部变量 )。为什么?
因为编译器无法确定RHS的类型
var add = (x, y) => x + y;
支持+
运算符的任何类型都是候选者,因为x和y的类型不是约束属于同一类型。 有许多可能使用的+
运算符退出,因此x和y的可能类型集相当大但是为了能够确定add的类型,编译器需要能够将set减少到只有一个类型为x,一个为y(不完全正确,可能是基类和派生类都适合),即使编译器可以找出x和y的类型,或者你指定类型让我们比如说你仍然会留下这样一个事实: Expression
和Func
都是可能的add类型
如何减少可能类型集有多种选择。 编译器可能会尝试查看以后如何使用add
但不会(尽管它确实可能无法确定类型)
var
关键字不起作用,因为lambda表达式作为表达式树用于两个委托,并且编译器不知道它应该转换为lambda。 换句话说,以下类型对您的(x, y) => x + y
lambda有效: Func
和Expression
。
您得到的错误是因为编译器不知道x和y是什么类型。