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