Если бы в то время, когда был изобретен 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>
и определены расширяющиеся преобразования в системный тип и из него (использование структуры, а не класса означало бы, что код избавит от необходимости создавать новые объекты кучи при приведении в любом сценарии, где структура не должна быть упакована в коробку).
person
supercat
schedule
03.07.2012