Как определить метод, который принимает список <Base>, а также список <Derived>в C # - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть следующий метод

List<List<Animal>> animalsList = new List<List<Animal>>();

public void AddAnimal(List<Animal> animals)
{
   animalsList.Add(animals);
}

Как я могу использовать этот метод для List<Dog>?

Я пробовал

public void AddAnimal<T>(List<T> animals) where T: Animal
{
   animalsList.Add(animals);
}

Это не 'тоже не работает.Есть ли способ определить такой метод?Я бы использовал IEnumerable<Animal>, но мне нужно отразить .Add(), .Clear() и такие методы во внутренних списках, не делая этого явно.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Попробуйте следующее:

        public void AddAnimal<T>(List<T> animals) where T : Animal
        {
            animalsList.Add(animals.Cast<Animal>().ToList());
        }
0 голосов
/ 21 ноября 2018

Здесь вы ищете ковариацию, которую C # не поддерживает в универсальных классах, но делает в универсальных интерфейсах.Более того, IList<T> не является ковариантным, а IEnumerable<T>.

Вы можете изменить параметр на IEnumerable<Animal>, а затем привести к списку в методе, который затем позволит передать в коллекцию коллекции производных типов Animal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...