Я бы предложил определить интерфейс IReadableList; если бы не тот факт, что индексатор чтения-записи не считается реализацией индексатора только для чтения, такая вещь могла бы быть родителем IList (IMHO, так должно было быть в любом случае). Существующие реализации IList не будут реализовывать IReadableList, если не заключить в оболочку, увы, но наличие интерфейса списка только для чтения сделало бы концепцию ковариации гораздо более полезной, поскольку IReadableList можно использовать в качестве IReadableList .
Кстати, я склонен думать, что хотя IList не наследуется от неуниверсального IList, возможно, так и должно быть. Любой IList может реализовать IList безопасным для типов способом, если неуниверсальная реализация доступна только для чтения. Даже если вы никогда не прочитаете какие-либо объекты из неуниверсального IList, его реализация позволит запустить подпрограмму, которая хочет IEnumerable , но получает IList [который, конечно, реализует IEnumerable , и, следовательно, неявно IEnumerable ], чтобы получить Count коллекции, не перечисляя ее.