【发布时间】:2021-10-22 16:22:32
【问题描述】:
这可能是重复的。但经过一天的研究,我希望你能宽大处理。 这是一个关于协方差的问题。
为什么我可以这样做?
List<Animal> allAnimals = new List<Animal>();
allAnimals.Add(new Dog());
allAnimals.Add(new Cat());
但不能这样做?
List<Dog> aBunchOfDogs = new List<Dog>();
allAnimals = aBunchOfDogs;
我已经阅读了一些关于协方差的讨论。
"Converting lists to interface lists"
"Casting list to interface list"
我的理解是,我不能将狗列表添加到动物列表中,因为这样我可以将猫添加到动物列表中,这很危险。但是将一只猫或一只狗的单个实例添加到动物列表中同样危险,不是吗? 在我看来,C# 还没有决定是否信任我。
【问题讨论】:
-
allAnimals = aBunchOfDogs:现在allAnimals是对aBunchOfDogs所引用的同一底层列表的引用,即List<Dog>。现在做allAnimals.Add(new Cat())——哎呀!我们在List<Dog>中添加了Cat。aBunchOfAnimals[^1]和aBunchOfDogs[^1]现在都返回Cat。这是不对的! -
你不能做类似
allAnimals = aBunchOfDogs as List<Animal>;的事情吗? -
@Rafalon 你可以试试,不过
allAnimals会是null... -
@canton7 刚刚在.net fiddle中尝试过,结果编译错误,所以我们甚至无法尝试。但是我们可以
allAnimals = new List<Animal>(aBunchOfDogs); -
男人。我想我全都错了。感谢你的帮助。我的大脑仍在试图解决这个问题,但你的 cmets 会做到这一点。这说得通。我可以将一只猫或一只狗或一群狗添加到动物列表中,因为我只能将动物列表用作动物。但是我不能将动物列表作为对狗列表的引用。因为那时我可以通过添加一只猫来打破狗名单。非常感谢!
标签: c# list casting covariance