为什么 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#是信不信我啊
假设您理解为什么可以将 Dog
和 Cat
实例传递给接受 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
}
这可能是重复的。但经过一天的研究,我希望你能宽大处理。 这是一个关于协方差的问题。
为什么我可以这样做?
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#是信不信我啊
假设您理解为什么可以将 Dog
和 Cat
实例传递给接受 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
}