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

时间:2011-08-18 18:10:23

标签: c# list polymorphism

我有一个班级Animal及其子类Dog。 我有一个List<Animal>,我想将一些List<Dog>的内容添加到List<Animal>。 有没有更好的方法,只需将List<Dog>转换为List<Animal>,然后使用AddRange

3 个答案:

答案 0 :(得分:16)

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

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

animals.AddRange(dogs);

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

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

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

如果你甚至没有C#3.5,那么你必须手动进行投射。

答案 1 :(得分:5)

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

animalList.AddRange(dogList);

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

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

答案 2 :(得分:2)

您可以使用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,则不需要强制转换。