如何创建表达式<func <dynamic,dynamic =“”>&gt; - 或者它是一个错误?</func <dynamic,>

时间:2010-01-12 03:15:56

标签: c# dynamic .net-4.0 lambda expression-trees

在我用表达树做了几天的时候,我遇到了一些我觉得难以理解的东西;希望有人能够在这里说清楚。

如果您编码Expression<Func<dynamic, dynamic>> expr1 = x => 2 * x;,编译器会抱怨并且您将无法获得任何结果。但是,它似乎,如果你通过一个方法创建一个这样的表达式,那么编译器似乎对此感到高兴,并且生成的应用程序正常工作。这没有意义,所以我想知道窗帘后面发生了什么。

我认为,在引擎盖下,ConvertExpression返回的表达式可能是Expression<Func<object, object>>类型,这是一种有效类型,但令我困惑的是我无法使用{{1}在声明中输入,但我可以将它用作方法的返回类型。请参阅下面的示例。

非常感谢!

Expression<Func<dynamic, dynamic>>

2 个答案:

答案 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()也算作操作。