在我用表达树做了几天的时候,我遇到了一些我觉得难以理解的东西;希望有人能够在这里说清楚。
如果您编码Expression<Func<dynamic, dynamic>> expr1 = x => 2 * x;
,编译器会抱怨并且您将无法获得任何结果。但是,它似乎,如果你通过一个方法创建一个这样的表达式,那么编译器似乎对此感到高兴,并且生成的应用程序正常工作。这没有意义,所以我想知道窗帘后面发生了什么。
我认为,在引擎盖下,ConvertExpression
返回的表达式可能是Expression<Func<object, object>>
类型,这是一种有效类型,但令我困惑的是我无法使用{{1}在声明中输入,但我可以将它用作方法的返回类型。请参阅下面的示例。
非常感谢!
Expression<Func<dynamic, dynamic>>
答案 0 :(得分:13)
我认为,在引擎盖下,ConvertExpression返回的表达式可能是
Expression<Func<object, object>>
类型,这是一种有效的类型
正确。
我不能在声明中使用
Expression<Func<dynamic, dynamic>>
类型,但我可以将它用作方法的返回类型。
该部分陈述不正确。正如您在示例中所述,在局部变量声明中使用该类型是完全合法的。
不合法的位是在lambda中执行动态操作,该lambda正在转换为表达式树类型。特定表达式树类型无关紧要;重要的是操作是动态的。
答案 1 :(得分:3)
我在尝试代码时遇到的编译错误是“错误CS1963:表达式树可能不包含动态操作”。我将问题行更改为Expression<Func<dynamic, dynamic>> expr1 = x => x;
(从lambda中删除“操作”)并且它有效!因此,您可以在表达式中使用动态,但实际上您无法对它们执行任何“操作”。我知道,不是很有帮助。在我的测试中,即使.ToString()
也算作操作。