lambda表达式语法与LambdaExpression类

时间:2011-02-25 23:52:54

标签: c# lambda

这行代码试图将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为什么不起作用?

4 个答案:

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