Если, в то время, IList<T>
был изобретен, Microsft было известно, что будущие версии .NET будет поддерживать интерфейс ковариации и контрвариацию, это было бы возможно и полезно разделить интерфейс на IReadableList<out T>
, IAppendable<in T>
и IList<T>
, которые наследует оба вышеперечисленных. Это наложило бы небольшую дополнительную работу на разработчиков vb.net (им пришлось бы определять как версии для чтения, так и чтения-записи индексированного свойства, поскольку по какой-то причине .net не разрешает чтение-запись свойство, которое должно выполняться как свойство только для чтения), но будет означать, что методы, которые просто должны читать элементы из списка, могут получить IReadableList<T>
ковариантным образом, а методы, которым просто нужна коллекция, которую они могут добавить, могут получить IAppendable<T>
в контравариантном мода.
К сожалению, единственное, что может быть реализовано сегодня, было бы, если бы Microsoft предоставила средства для новых интерфейсов, которые можно было бы заменить на старые, с использованием старых интерфейсов, автоматически используя методы по умолчанию, предоставляемые новыми. Я бы подумал, что такая функция (взаимозаменяемость интерфейса) будет чрезвычайно полезна, но я бы не задерживал дыхание, ожидая, что Microsoft ее выполнит.
Учитывая, что нет возможности вернуться к IReadableList<T>
в IList<T>
, альтернативным подходом было бы определить собственный интерфейс, связанный с списком. Одна из трудностей при этом состоит в том, что все экземпляры System.Collections.Generic.List<T>
должны быть заменены каким-либо другим типом, хотя сложность этого может быть сведена к минимуму, если нужно определить структуру List<T>
в другом пространстве имен, содержащем одно поле System.Collections.Generic.List<T>
и (с использованием структуры, а не класса, будет означать, что код будет избегать необходимости создания новых объектов кучи при кастинге в любом сценарии, в котором структура не должна быть вложена в коробку).
Чтобы устранить основные проблемы этого вопроса относительно обобщенной проблемы преобразования типов в .NET, см. Мой ответ на соответствующий вопрос в разделе [Как преобразовать типы во время выполнения?] (Http://stackoverflow.com/ вопросы/312858/how-can-i-convert-types-at-runtime/7942350 # 7942350) – 2011-10-29 23:43:45