lambda表达式语法与LambdaExpression类

Joh*_*n K 10 c# lambda

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

LambdaExpression expr = n => n;
Run Code Online (Sandbox Code Playgroud)

它失败并出现编译错误消息:

无法将lambda表达式转换为类型'System.Linq.Expressions.LambdaExpression',因为它不是委托类型

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

来自MSDN的 Factory Lambda

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

那不是委托类型.

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

Dan*_*Tao 10

嗯,这确实有效:

Expression<Func<int, int>> exp = n => n;
LambdaExpression lambda = exp;
Run Code Online (Sandbox Code Playgroud)

请注意,Expression<TDelegate>派生自LambdaExpression.

我认为你不能仅仅使用LambdaExpression类型的原因是,n无法推断(在你的例子中)的类型.

考虑到你也不能这样做的事实,原因基本相同:

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

可以这样做:

Action a = () => Console.WriteLine("Hi!");
Delegate d = a;
Run Code Online (Sandbox Code Playgroud)

这基本上是一回事.