我有一堆实现接口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,不能升级到更高版本。
答案 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);
}