Посмотрите на спецификацию класса ReadOnlyCollection, он реализует IList, правильно.
В интерфейсе IList есть методы добавления/обновления/чтения, которые мы называем предварительными условиями интерфейса. В любом случае в моем приложении, если у меня есть IList, я должен иметь возможность выполнять все подобные операции.
Но как насчет того, верну ли ReadOnlyCollection где-нибудь в моем коде и попытаюсь вызвать метод .Add(...)? Он генерирует исключение NotSupportedException. Считаете ли вы, что это хороший пример плохого дизайна? Кроме того, этот класс нарушает Принцип замены Лискова?
Почему Microsoft реализовала этот способ? Должно ли быть проще (и лучше), чтобы этот ReadOnlyCollection реализовал только интерфейс IEnumerable (который, кстати, уже только для чтения)?