IList<T>
не наследует IList
, где IEnumerable<out T>
наследует IEnumerable
.
Если модификатор out
является единственной причиной, то почему большая часть реализации IList<T>
(например, Collection<T>
, List<T>
) реализует интерфейс IList
.
Итак, любой может сказать "ОК", если эти утверждения верны для всей реализации IList<T>
, а затем при необходимости направить его на IList
. Но проблема в том, что хотя IList<T>
не наследует IList
, поэтому не гарантируется, что каждый объект IList<T>
IList
.
Кроме того, использование IList<object>
, очевидно, не является решением, потому что без out
генераторы-генераторы не могут быть назначены классу less inherit; и создание нового экземпляра List не является решением здесь, потому что кому-то может понадобиться фактическая ссылка IList<T>
в качестве указателя IList
; и использование List<T>
insteed IList<T>
на самом деле является плохой практикой программирования и не служит целям.
Если .NET хочет предоставить гибкость в том, что каждая реализация IList<T>
не должна иметь контракт с нестандартной реализацией (т.е. IList
), то почему они не сохранили другой интерфейс, который реализует как общие, так и не общие и не предполагал, что весь конкретный класс, который хочет заключить контракт на родовой и негенический элемент, должен сжиматься через этот интерфейс.
Такая же проблема возникает при литье ICollection<T>
в ICollection
и IDictionary<TKey, TValue>
в IDictionary
.