为什么我不能将List <t:=“”interface =“”>添加到List <list <interface>&gt;?</list <interface> </t>

时间:2014-09-22 13:21:48

标签: c# .net .net-3.5

我有一堆实现接口I的对象列表。我想制作这些列表的列表,并将它们作为单个对象进行处理。我已经尝试制作一个List<List<I>>并将其他列表添加到其中,这在我看来是有意义的,因为我添加的列表包含实现I的对象,但编译器不是&#39;让我这样做。

示例:

public interface I
{
 //stuff
}

public class A : I
{
 //...
}
public class B : I
{
 //...
}

//elsewhere
public class C
{
    List<A> ListOfA; 
    List<B> ListOfB; 
    List<List<I>> ListOfLists;
    public C()
    {
        ListOfA = new List<A>();
        ListOfB = new List<B>();
        ListOfLists = new List<List<I>>();
        ListOfLists.Add(ListOfA); //nope
        ListOfLists.Add(ListOfB); //nope
    }
}

我有两个问题,第一个问题是为什么这是不允许的行为?第二个是我如何才能完成我正在寻找的东西?

为了澄清,当我尝试将列表添加到ListOfLists时,我得到&#34;无法从列表转换为列表&#34;其中T : I。我使用的是.NET 3.5,不能升级到更高版本。

2 个答案:

答案 0 :(得分:1)

如果可以的话,你可以写:

List<I> listOfAs = ListOfLists[0];

var B = new B();
listOfAs.Add(B);

显然禁止使用,因为您无法将B实例添加到A列表中。

Eric Lippert的

This answer给出了一个与动物而不是As和Bs相似的例子。

要回答你的第二个问题,我们需要做你打算用ListOfLists做的事情,只需在初始化之后枚举或修改它。

如果想法只是拥有I实例的只读集合:

IEnumerable<I> collectionOfIs = ListOfA.Cast<I>().Concat(ListOfB.Cast<I>());

因为List实现IEnumerable

而起作用

然后,您可以使用ToList来实现集合,并能够使用索引器:

List<I> listOfIs = collectionOfIs.ToList();

答案 1 :(得分:0)

您需要使用IEnumerable<I>,因为List<I>是一个集合对象

    List<A> ListOfA;
    List<B> ListOfB;
    List<IEnumerable<I>> ListOfLists;
    public C()
    {
        ListOfA = new List<A>();
        ListOfB = new List<B>();
        ListOfLists = new List<IEnumerable<I>>();
        ListOfLists.Add(ListOfA);
        ListOfLists.Add(ListOfB);
    }