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

时间:2019-07-10 15:55:05

标签: c# lambda expression func

在下面的示例中,相同的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呢?

1 个答案:

答案 0 :(得分:0)

Func<int>是委托实例-对象的实例;除了“此目标对象引用,此方法句柄”以外,它不再具有任何语义状态。

表达树更丰富的东西;它是代码意图的复杂图形-本质上是AST。您可以将表达式编译为委托实例,但是不能将委托反向为表达式树。

当您这样做:

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

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

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

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