好的,所以我正在编写一些非常混乱的代码,因为我正在使用的库返回动态类型层次结构。其中一些类型可以展开为动态类型列表,为了让我能够在LINQ中处理这些动态对象层次结构,我编写了一个小方法,基本上将一些动态对象转换为IEnumerable<dynamic>。
我有一个返回IEnumerable<dynamic>的方法,但是当我尝试在LINQ中使用它时,会出现错误“无法在不首先将其强制转换为委托或表达式树类型的情况下使用Lambda表达式作为动态分派操作的参数。”,但是如果我将方法的返回值从IEnumerable<dynamic>转换为IEnumerable<dynamic>(在我看来是一个无操作),它就可以编译并正常工作。
有人能解释一下这种行为吗?
void Main()
{
Foo(null).Select(value => value); // OK... I was expecting this to work.
dynamic unknown = new ExpandoObject();
Foo(unknown).Select(value => value); //COMPILER ERROR: Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type... this was a bit more unexpected.
((IEnumerable<dynamic>)Foo(unknown)).Select(value => value); // OK... this was really unexpected.
}
IEnumerable<dynamic> Foo(dynamic param)
{
yield return "Tranformation logic from param to IEnumerable of param goes here.";
}