С# - Как преобразовать List <Dog> в список <Animal>, когда Dog является подклассом Animal?

У меня есть класс Animal и его подкласс Dog. У меня есть List<Animal>, и я хочу добавить содержимое некоторого List<Dog> в List<Animal>. Есть ли лучший способ сделать это, чем просто передать List<Dog> в List<Animal>, а затем использовать AddRange?

Ответ 1

Вам не нужен бросок, если вы используете С# 4:

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

animals.AddRange(dogs);

Это допустимо, потому что AddRange() принимает IEnumerable<T>, который ковариант.

Если у вас нет С# 4, то вам придется перебирать List<Dog> и бросать каждый элемент, поскольку ковариация была добавлена ​​только тогда. Вы можете выполнить это с помощью метода расширения .Cast<T>:

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

Если у вас даже нет С# 3.5, вам придется делать кастинг вручную.

Ответ 2

Я считаю, что это зависит от того, какую версию .Net вы используете. Я мог ошибаться, но в .Net 4 Я думаю, вы можете сделать

animalList.AddRange(dogList);

В противном случае в .Net 3.5 вы можете сделать

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

Ответ 3

Вы можете использовать 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: Как указывает dlev, если вы запускаете фреймворк 4, вам не нужно бросать.