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

LambdaExpression expr = n => n;

它失败,并显示编译错误消息:



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

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

那不是委托(delegate)类型。

这使我们想知道为什么lambda到LambaExpression无法工作?

最佳答案

好吧,这确实有效:

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;

本质上是同一件事。

10-04 17:04