C # Как перебрать словарь общего родительского класса для родовых детей? - PullRequest
0 голосов
/ 18 марта 2019

У меня такая ситуация:

class Animal 
{
  int size;
} 

class Dog : Animal 
{
 string Name;
}

class Cat : Animal 
{
 string Alias;
}

public void Check( Dictionary<string,Animal> animals ) 
{
 foreach(var pet in animals){...}
}

Мой вопрос здесь:

если Собака распространяет животное, почему Дионер не признает Собаку как Животное?

Есть ли у вас идеи, позволяющие передать словарь дочернего класса и выполнить его итерацию (без использования словаря обработки (строка, объект))?

public void MySituation()

    {
        Dictionary<string,Animal> dogs = new Dictionary<string,Dog>();
        ** ERROR 01**

        Dictionary<string,Cat> cats = new Dictionary<string,Cat>();
        Check(cats);
        ** ERROR 02**
    }

Большое спасибо. С вами будет сила оптимизации компилятора.

1 Ответ

1 голос
/ 18 марта 2019

Проблема с Dictionary<string,Animal> в том, что она позволяет добавлять.Если бы вы могли добавить «животное» в словарь собак, вы могли бы легко оказаться там с кошкой, тогда весь ад вырвался бы на свободу.Таким образом, компилятор не позволит вам рассматривать любой другой тип словаря как тот же.

Что вам нужно сделать, это использовать интерфейс только для чтения, такой как IEnumerable.

public void Check( IEnumerable<KeyValuePair<string,Animal>> animals ) 
{
     foreach(var pair in animals)
     {
         var animal = pair.Value;
         //Do something
     }
}

Другой вариант - сделать ваш метод универсальным:

public void Check<T>( Dictionary<string,T>> animals ) where T : animal
{
     foreach(T animal in animals)
     {
         //Do something
     }
}

Если вы хотите понять теорию, лежащую в основе этого, посмотрите один из ответов о ковариации и контравариантности, например этот или этот .

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