繁体   English   中英

IEnumerable <IEnumerable> &gt;和扩展方法

[英]IEnumerable<IEnumerable>> and Extension Method

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM