我写了这个扩展方法:
public static class A
{
public static IEnumerable<dynamic> AsDynamic<T>(this IEnumerable<T> f)
{
foreach (var element in f)
{
yield return (dynamic) element;
}
}
}
并测试了它:
List<int> l = new List<int>(){1,2,3};
Console.WriteLine ( l.AsDynamic().GetType());
但是输出是:typeof (IEnumerable<Object>)
为什么不是
typeof (IEnumerable<dynamic>)
?我怎样才能让它像它?
最佳答案
我认为你对什么有误解dynamic
方法。本质上,当您告诉编译器一个对象的类型是 dynamic
时,您“ promise ”该对象在运行时 将支持您调用的任何方法或属性,以换取编译器在编译时 不报错。您还 promise ,如果您违背 promise ,您将承担后果。
当你说一个对象是dynamic
,编译器无法对类型做出假设,因此它使用 object
,知道任何东西都可以存储为 object
.当你制作 IEnumerable<dynamic>
, 它变成了 IEnumerable<object>
,有一个显着的区别:你可以在它的元素上调用任何方法,编译器不会说一句话:
IEnumerable<SomeType> original = ...
foreach (dynamic x in original.AsDynamic()) { // Using your method
Console.WriteLine(x.SomeUnsupportedMethod()); // The compiler is silent!
}
自 original.AsDynamic()
给出一个序列 dynamic
对象,编译器不会提示您对 SomeUnsupportedMethod
的调用.如果运行时确实不支持该方法,程序就会崩溃;如果 SomeType
的元素实际上支持该方法,不会有崩溃,并且会调用该方法。
这就是所有 dynamic
会为你做的;静态地,“占位符”将保留 object
, 和 typeof
会告诉你的。但是直到运行时才会检查对象的确切功能(它的方法和属性)。
关于c# - 转换为 IEnumerable<动态>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14111088/