Обычно я понимаю интерфейсы, наследование и полиморфизм, но меня озадачила одна вещь.
В этом примере
1194192] Cat реализует IAnimal и, конечно, List реализует IList :
IList<IAnimal> cats = new List<Cat>();
, но генерирует ошибку компиляции (Невозможно неявно преобразовать тип ...) . Это также не сработает, если я использую суперкласс asbtract [Animal], от которого наследуется Cat. Однако, если я заменю IAnimal на Cat :
IList<Cat> cats = new List<Cat>();
он компилируется нормально.
На мой взгляд, потому что Cat реализует IAnimal ], первый пример должен быть приемлемым , что позволяет нам возвращать интерфейс как для списка, так и для содержащегося в нем типа.
Кто-нибудь может объяснить, почему это недействительно? Я уверен, что есть логическое объяснение.