Lambda表达式语法与LambdaExpression类

10

这行代码试图将一个 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<ParameterExpression>() { paramExpr }
);

而且这并不是一个委托类型。

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

4个回答

12

好的,这个确实有效:

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;

本质上它是相同的。


2
因为LambdaExpression是在运行时生成Lambda表达式的方式,而n => n会在编译时转换为一个生成的类。
简而言之:它们是为了做同一件事情而存在的两种不同方法,但不能同时使用。

2

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

LambdaExpression的NodeType属性的值为Lambda。

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


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接