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相同。