c# - 为什么不能将 Func 强制转换为 Expression,而 lambda 可以
问题描述
在下面的示例中,相同的 lambda 可以作为Expression
in保存,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
?
解决方案
AFunc<int>
是一个委托实例——一个对象的实例;除了“此目标对象引用,此方法句柄”之外,它不再具有任何语义状态。
表达式树要丰富得多;它是代码意图的复杂图 - 本质上是 AST。您可以将表达式编译为委托实例,但不能将委托反转为表达式树。
当你这样做时:
Expression<Func<int>> func = () => 2;
您正在创建一个复杂的树;本质上:
var func = Expression.Lambda<Func<int>>(Expression.Constant(2, typeof(int)),
Array.Empty<ParameterExpression>());
(但显然在一般情况下要复杂得多)
推荐阅读
- java - 可以在json中进行区分和过滤吗?
- caching - 如何防止人们绕过我的服务器缓存?
- c# - Binding 无法识别 OnPropertyChanged
- ios - 如果在 iOS 设置中禁用通知访问时安排本地通知,则不会在 iOS 13 上触发本地通知
- json - 在 ReactXP 中导入 JSON 文件
- javascript - 为什么 jsFiddle 不喜欢这个循环?
- c# - 集合视图、数据绑定、MVVM
- mysql - mysql:如果没有找到记录,请避免写入输出文件
- c++ - 计算对类函数的所有调用次数
- google-apps-script - 使用 onOpen() 函数自动删除日期为 -30 天的行