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