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

Why List<Parent> permits adding new Child but not assigning from List<Child>

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

为什么我可以这样做?

List<Animal> allAnimals = new List<Animal>();
allAnimals.Add(new Dog());
allAnimals.Add(new Cat());

但是不能这样做?

List<Dog> aBunchOfDogs = new List<Dog>();
allAnimals = aBunchOfDogs;

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

"Covariance in C#"

"Converting lists to interface lists"

"Casting list to interface list"

我的理解是,我不能将狗列表添加到动物列表中,因为那样我可以将猫添加到动物列表中,这很危险。但是将猫或狗的单个实例添加到动物列表中同样危险,不是吗? 看来C#是信不信我啊

假设您理解为什么可以将 DogCat 实例传递给接受 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
}