Нет, это не является законным в C #. C # 4 и выше поддерживают ковариацию и контравариантность общих интерфейсов и общих делегатов, когда они построены с использованием ссылочных типов. Например, IEnumerable<T>
является ковариантным, поэтому вы можете сказать:
List<Giraffe> giraffes = new List<Giraffe>() { ... };
IEnumerable<Animal> animals = giraffes;
, но не
List<Animal> animals = giraffes;
. Поскольку в список животных может быть включен тигр, но список жирафов не может.
Сделайте веб-поиск по ковариации и контравариантности на C #, и вы найдете много статей об этом.