首页 > 解决方案 > 为什么不能将 Func 强制转换为 Expression,而 lambda 可以

问题描述

在下面的示例中,相同的 lambda 可以作为Expressionin保存,test但当它来自 a 时无法编译Func

Func<int> func = () => 2;
Expression test1 = (Expression<Func<int>>)(() => 2);
Expression test2 = (Expression<Func<int>>)(func); //does not compile

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

标签: c#lambdaexpressionfunc

解决方案


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

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

当你这样做时:

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

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

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

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


推荐阅读