Преобразования IList и List с Интерфейсы

Обычно я понимаю интерфейсы, наследование и полиморфизм, но меня озадачила одна вещь.

В этом примере

1194192] Cat реализует IAnimal и, конечно, List реализует IList :

IList<IAnimal> cats = new List<Cat>();

, но генерирует ошибку компиляции (Невозможно неявно преобразовать тип ...) . Это также не сработает, если я использую суперкласс asbtract [Animal], от которого наследуется Cat. Однако, если я заменю IAnimal на Cat :

IList<Cat> cats = new List<Cat>();

он компилируется нормально.

На мой взгляд, потому что Cat реализует IAnimal ], первый пример должен быть приемлемым , что позволяет нам возвращать интерфейс как для списка, так и для содержащегося в нем типа.

Кто-нибудь может объяснить, почему это недействительно? Я уверен, что есть логическое объяснение.

6
задан Curtmantle 1 June 2011 в 16:11
поделиться