在下面的示例中,相同的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
呢?
答案 0 :(得分:0)
Func<int>
是委托实例-对象的实例;除了“此目标对象引用,此方法句柄”以外,它不再具有任何语义状态。
表达树是更丰富的东西;它是代码意图的复杂图形-本质上是AST。您可以将表达式编译为委托实例,但是不能将委托反向为表达式树。
当您这样做:
Expression<Func<int>> func = () => 2;
您正在创建复杂的树;本质上:
var func = Expression.Lambda<Func<int>>(Expression.Constant(2, typeof(int)),
Array.Empty<ParameterExpression>());
(显然,在一般情况下要复杂得多)