为什么不能将 Func 转换为 Expression,但 lambda 可以

Why can not be Func casted to Expression, but lambda can

在下面的示例中,相同的 lambda 可以作为 Expression 保存在 test 中,但是当它来自 Func:

时编译失败
Func<int> func = () => 2;
Expression test1 = (Expression<Func<int>>)(() => 2);
Expression test2 = (Expression<Func<int>>)(func); //does not compile

为什么 lambda 可以直接转换为 Expression,但当它表示为 Func 时却不能?

一个Func<int>是一个委托实例——一个对象的实例;它不再具有除 "this target object reference, this method handle".

之外的任何语义状态

表达式树 更丰富;它是代码 intent 的复杂图表——本质上是一个 AST。您可以将表达式编译为委托实例,但不能将委托反转为表达式树。

当你这样做时:

Expression<Func<int>> func = () => 2;

您正在创建一个复杂的树;本质上:

var func = Expression.Lambda<Func<int>>(Expression.Constant(2, typeof(int)),
    Array.Empty<ParameterExpression>());

(但显然在一般情况下要复杂得多)