为什么 List<Parent> 允许添加新的 Child 但不允许从 List<Child> 分配

0 c# casting list covariance

这可能是重复的。但经过一天的研究,我希望得到你的宽大处理。这是一个关于协方差的问题。

为什么我可以做到这一点?

List<Animal> allAnimals = new List<Animal>();
allAnimals.Add(new Dog());
allAnimals.Add(new Cat());
Run Code Online (Sandbox Code Playgroud)

但不能这样做吗?

List<Dog> aBunchOfDogs = new List<Dog>();
allAnimals = aBunchOfDogs;
Run Code Online (Sandbox Code Playgroud)

我读过一些关于协方差的讨论。

“C# 中的协方差”

“将列表转换为接口列表”

“将列表投射到接口列表”

我的理解是,我不能将狗列表添加到动物列表中,因为这样我可以将猫添加到动物列表中,这将是危险的。但是将猫或狗的单个实例添加到动物列表中也同样危险,不是吗?在我看来,C# 还没有决定是否信任我。

Joh*_*lay 5

假设您了解为什么可以将 aDogCat实例传递给接受方法Animal,这就是为什么不允许您的后一个示例:

List<Dog> aBunchOfDogs = new List<Dog>();
allAnimals = aBunchOfDogs;
allAnimals.Add(new Cat()); // Fine because allAnimals is List<Animal>

foreach (var dog in aBunchOfDogs)
{
    dog.Woof(); // The Cat can't woof
}
Run Code Online (Sandbox Code Playgroud)