问题
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