为什么不能将 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>());
(但显然在一般情况下要复杂得多)
在下面的示例中,相同的 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>());
(但显然在一般情况下要复杂得多)