【问题标题】:lambda expression syntax vs LambdaExpression classlambda 表达式语法与 LambdaExpression 类
【发布时间】:2011-07-04 16:26:33
【问题描述】:

这行代码尝试将 lambda 表达式分配给 LambaExpression 类型变量,

LambdaExpression expr = n => n;

编译错误信息失败:

无法转换 lambda 要键入的表达式 'System.Linq.Expressions.LambdaExpression' 因为它不是代表 输入

所以它需要是一个委托类型。从概念上讲,这对我来说似乎很奇怪,因为我可以使用这样的工厂方法构建一个 LambdaExpression 实例。

工厂 Lambda from MSDN

LambdaExpression lambdaExpr = Expression.Lambda(
    Expression.Add(
        paramExpr,
        Expression.Constant(1)
    ),
    new List<ParameterExpression>() { paramExpr }
);

这不是委托类型。

这让我们想知道为什么 lambda to LambaExpression 不能工作?

【问题讨论】:

    标签: c# lambda


    【解决方案1】:

    嗯,这确实工作:

    Expression<Func<int, int>> exp = n => n;
    LambdaExpression lambda = exp;
    

    请注意,Expression&lt;TDelegate&gt; 派生自 LambdaExpression

    我认为您不能只使用 LambdaExpression 作为类型的原因是无法推断出 n 的类型(在您的示例中)。

    考虑到您也不能这样做,原因基本相同:

    // What is this? An Action? A ThreadStart? What?
    Delegate d = () => Console.WriteLine("Hi!");
    

    而您可以这样做:

    Action a = () => Console.WriteLine("Hi!");
    Delegate d = a;
    

    本质上是一样的。

    【讨论】:

      【解决方案2】:

      因为LambdaExpression 是一种在运行时生成 lambda 表达式的方法,而 n =&gt; n 在编译时被转换为生成的类。

      简而言之:它们是做同一件事的两种不同的东西,但不能一起使用。

      【讨论】:

        【解决方案3】:

        引用 MSDN LambdaExpression 类型以表达式树的形式表示一个 lambda 表达式。 Expression 类型,它派生自 LambdaExpression 并更明确地捕获 lambda 表达式的类型,也可用于表示 lambda 表达式。在运行时,表示 lambda 表达式的表达式树节点始终是 Expression 类型。

        LambdaExpression 的 NodeType 属性的值为 Lambda。

        使用 Lambda 工厂方法创建 LambdaExpression 对象。

        【讨论】:

          【解决方案4】:

          仔细阅读错误消息的内容。 LambdaExpression 不是委托。是普通班。阅读http://msdn.microsoft.com/en-us/library/system.linq.expressions.lambdaexpression.aspx。因为名称中有 Lambda 并不意味着它与“真正的”lambda 相同。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-12
            • 2010-12-05
            • 1970-01-01
            • 2021-07-09
            • 1970-01-01
            • 2017-10-30
            • 2013-07-16
            相关资源
            最近更新 更多