我想知道是否有人可以帮助我理解以下行为。在下面的代码中,我正在创建一个CustomObject
实例,其中包含一个类型为IEnumerable<IEnunumerable>>
的单个Property。
我在IEnumerable<T>
上有一个扩展方法,叫做AsDataTable
。
public class CustomObject
{
public IEnumerable<IEnumerable> Collection {get;set;}
}
public static class ExtensionMethods
{
public static bool AsDataTable<T>(this IEnumerable<T> list)
{
Console.Write("In extension method");
return default(bool);
}
}
void Main()
{
var ttObject = new CustomObject()
{
Collection = new List<IEnumerable>
{
new List<int>{1,2,3},
new [] {new{A="abc",B="def"}}
}
};
var dummy = new []{new {a='r'}}.AsDataTable();
foreach(var item in ttObject.Collection)
{
var temp = item.AsDataTable();
Console.WriteLine($"Item is IEnumerable : {item is IEnumerable}");
}
}
是什么让我怀疑下面的代码行是否有效(或更确切地说是编译)
var dummy = new []{new {a='r',b='3'}}.AsDataTable();
当我遍历CustomObject
的Collection属性然后执行相同操作时,它不允许我编译。
var temp = item.AsDataTable(); // this doesn't work
奇怪的是,以下行再次返回true,再次确认“ item”确实为IEnumerable
。
Console.WriteLine($"Item is IEnumerable : {item is IEnumerable}");
我想是因为扩展方法是在通用版本IEnumerable<T>
上编写的,但是它如何在匿名类型数组(在CustomObject
之外)上起作用。
答案 0 :(得分:2)
IEnumerable<T>
实现IEnumerable
,反之亦然。
通过一些运行时黑客攻击,SomeType[]
实际上确实实现了IEnumerable<SomeType>
。另一方面,IEnumerable
不是-并且重载解析是在编译时完成的,因此编译器不知道您集合中的IEnumerable
项实际上也实现了IEnumerable<int>
。 / p>
如果您需要使用IEnumerable
,则需要在扩展方法中使用它。