C# - 当Dog是Animal的子类时,如何将List <Dog>转换为List <Animal>?

mic*_*ael 11 c# polymorphism list

我有一个类Animal及其子类Dog.我有一个List<Animal>,我想添加一些内容List<Dog>List<Animal>.有没有更好的方法来做到这一点,而不仅仅是将其转换List<Dog>为a List<Animal>,然后使用AddRange

dle*_*lev 16

如果您使用C#4,则不需要演员:

List<Animal> animals = new List<Animal>();
List<Dog> dogs = new List<Dog>();

animals.AddRange(dogs);
Run Code Online (Sandbox Code Playgroud)

这是允许的,因为AddRange()接受的IEnumerable<T>,这是协变.

但是,如果你没有C#4,那么你必须迭代List<Dog>并投射每个项目,因为只是添加了协方差.您可以通过.Cast<T>扩展方法完成此操作:

animals.AddRange(dogs.Cast<Animal>());
Run Code Online (Sandbox Code Playgroud)

如果你甚至没有C#3.5,那么你将不得不手动进行投射.


Phi*_*hil 5

我相信这取决于您使用的.Net版本.我可能会弄错,但在.Net 4中,我认为你可以做到

animalList.AddRange(dogList);
Run Code Online (Sandbox Code Playgroud)

否则在.Net 3.5中,你可以做到

animalList.AddRange(dogList.Select(x => (Animal)x));
Run Code Online (Sandbox Code Playgroud)