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

12
我有一个类Animal,和它的子类Dog。 我有一个List,我想把一些List的内容添加到List中。 除了将List转换为List然后使用AddRange之外,还有更好的方法吗?
3个回答

17

如果您使用的是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,那么您将需要手动进行类型转换。


1
基本上我要发布的内容和你一样 - 你不能强制转换,但是你可以使用协变的AddRange()方法在列表类型之间进行“转换”。虽然不完美,但它能够完成任务。 - Broam

5

我认为这取决于你使用的.NET版本。虽然我可能错了,但在.NET 4中,我认为你可以这样做:

animalList.AddRange(dogList);

否则在 .Net 3.5 中,您可以进行以下操作:
animalList.AddRange(dogList.Select(x => (Animal)x));

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,则无需进行强制转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接