这可能是重复的。但经过一天的研究,我希望得到你的宽大处理。这是一个关于协方差的问题。
为什么我可以做到这一点?
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# 还没有决定是否信任我。
假设您了解为什么可以将 aDog和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
}
Run Code Online (Sandbox Code Playgroud)