可能的重复项:
C# 差异问题:将列表<派生>分配为 List派生>
我在列表继承方面有问题。看起来具有更多指定成员的通用列表无法转换为具有其基本成员的列表。看看这个:
class A
{
public int aValue {get; set;}
}
class B : A
{
public int anotherValue {get; set;}
}
您现在可能认为List<B>
也是List<A>
但事实并非如此。 List<A> myList = new List<B>()
是不可能的。甚至没有List<A> myList = (List<A>)new List<B>()
在面向对象编程 3 年后,我在这里错过了一些基本概念吗?
是的!
假设你可以做
List<A> myList = new List<B>();
然后假设你有一个类
class C : A { public int aDifferentValue { get; set; } }
C
是一个A
,所以你会期望能够像myList
认为它是一个List<A>
一样调用myList.Add(new C())
。
但是C
不是B
所以myList
——这真的是一个List<B>
——不能持有C
.
相反,假设你可以做
List<B> myList = new List<A>();
你可以愉快地打电话给myList.Add(new B())
,因为B
是A
。
但是假设其他东西在您的列表中卡了一个C
(因为C
是一个A
)。
然后myList[0]
可能会返回一个C
- 这不是一个B
。
不允许进行简单的转换现在使用
List<B> lb = new List<B> { ... };
List<A> la = lb.Cast<A>().ToList();