lambda表达式语法与LambdaExpression类
这行代码尝试将lambda表达式分配给LambaExpression
类型变量,
LambdaExpression expr = n => n;
它失败并出现编译错误消息:
无法将lambda表达式转换为类型’System.Linq.Expressions.LambdaExpression’,因为它不是委托类型
所以它需要是一个委托类型。 从概念上讲,这对我来说似乎很奇怪,因为我可以使用像这样的工厂方法构建一个LambdaExpression
实例。
来自MSDN的 Factory Lambda
LambdaExpression lambdaExpr = Expression.Lambda( Expression.Add( paramExpr, Expression.Constant(1) ), new List() { paramExpr } );
那不是代表类型。
这让我们想知道为什么lambda到LambaExpression不起作用?
嗯,这确实有效:
Expression> exp = n => n; LambdaExpression lambda = exp;
请注意, Expression
派生自LambdaExpression
。
我认为你不能只使用LambdaExpression
作为类型的原因是,无法推断n
的类型(在你的例子中)。
考虑到你也不能这样做的事实,原因基本相同:
// What is this? An Action? A ThreadStart? What? Delegate d = () => Console.WriteLine("Hi!");
你可以这样做:
Action a = () => Console.WriteLine("Hi!"); Delegate d = a;
这基本上是一回事。
因为LambdaExpression
是一种在运行时生成lambda表达式的方法,因为n => n
会在编译时转换为生成的类。
简而言之:它们是做同样事情的两个不同的事情,但不能一起使用。
引用MSDN LambdaExpression类型表示表达式树forms的lambda表达式。 Expression类型派生自LambdaExpression并更明确地捕获lambda表达式的类型,也可用于表示lambda表达式。 在运行时,表示lambda表达式的表达式树节点始终为Expression类型。
LambdaExpression的NodeType属性的值是Lambda。
使用Lambda工厂方法创建LambdaExpression对象。
仔细阅读错误消息的内容。 LambdaExpression不是委托。 这是正常的课程。 阅读http://msdn.microsoft.com/en-us/library/system.linq.expressions.lambdaexpression.aspx 。 因为名字中有Lambda并不意味着它与’true’lambda相同。