c# -如何转换List到List,当Dog是Animal的子类时

本文关键字:Dog Animal List 子类 转换 何转换 | 更新日期: 2023-09-27 18:06:06

我有一个类Animal,和它的子类Dog。我有一个List<Animal>,我想加入一些List<Dog>的内容到List<Animal>中。是否有更好的方法来做到这一点,而不是仅仅将List<Dog>转换为List<Animal>,然后使用AddRange ?

c# -如何转换List<Dog>到List<Animal>,当Dog是Animal的子类时

如果使用c# 4,则不需要强制类型转换:

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

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

如果你没有c# 4,那么你将不得不迭代List<Dog>并强制转换每个项目,因为协方差只是在那时添加的。您可以通过.Cast<T>扩展方法完成此操作:

animals.AddRange(dogs.Cast<Animal>());

如果你甚至没有c# 3.5,那么你将不得不手动执行强制类型转换

我相信这取决于你使用的是哪个版本的。net。我可能是错的,但是在。net 4中我认为你可以做

animalList.AddRange(dogList);

否则在。net 3.5中,你可以使用

animalList.AddRange(dogList.Select(x => (Animal)x));

您可以使用Cast<T> ()

//You must have using System.Linq;
List<Dog> dogs = new List<Dog> ();
List<Animal> animals = new List<Animal> ();
animals.AddRange (dogs.Cast<Animal> ());

编辑:正如dlev指出的,如果你运行框架4,你不需要强制转换。