C# - How to convert List<Dog> to List<Animal>, when Dog is a subclass of Animal?

和自甴很熟 提交于 2020-01-11 08:08:41

问题


I have a class Animal, and its subclass Dog. I have a List<Animal> and I want to add the contents of some List<Dog> to the List<Animal>. Is there a better way to do so, than just cast the List<Dog> to a List<Animal>, and then use AddRange?


回答1:


You don't need the cast if you're using C#4:

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

animals.AddRange(dogs);

That's allowed, because AddRange() accepts an IEnumerable<T>, which is covariant.

If you don't have C#4, though, then you would have to iterate the List<Dog> and cast each item, since covariance was only added then. You can accomplish this via the .Cast<T> extension method:

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

If you don't even have C#3.5, then you'll have to do the casting manually.




回答2:


I believe this depends on which version of .Net you're using. I could be mistaken, but in .Net 4 I think you can do

animalList.AddRange(dogList);

Otherwise in .Net 3.5, you can do

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



回答3:


You can use 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> ());

EDIT : As dlev points out, if you run framework 4 you don't need to cast.



来源:https://stackoverflow.com/questions/7112036/c-sharp-how-to-convert-listdog-to-listanimal-when-dog-is-a-subclass-of-an

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!