IEnumerable <ienumerable >>和扩展方法

时间:2018-10-12 05:08:29

标签: c# ienumerable extension-methods

我想知道是否有人可以帮助我理解以下行为。在下面的代码中,我正在创建一个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之外)上起作用。

1 个答案:

答案 0 :(得分:2)

IEnumerable<T>实现IEnumerable,反之亦然。

通过一些运行时黑客攻击,SomeType[]实际上确实实现了IEnumerable<SomeType>。另一方面,IEnumerable不是-并且重载解析是在编译时完成的,因此编译器不知道您集合中的IEnumerable项实际上也实现了IEnumerable<int>。 / p>

如果您需要使用IEnumerable,则需要在扩展方法中使用它。