Предположим, у вас есть экземпляр MonitoredCollection<SomeObject>
, и вы хотите рассматривать его как экземпляр MonitoredCollection<ISomeInterface>
, где SomeObject
фактически реализует ISomeInterface
.Это не создает никаких проблем для извлечения элементов из коллекции, поскольку объект типа SomeObject
может быть преобразован в тип интерфейса ISomeInterface
.
Однако для всех методов в вашей коллекции, которые изменяют коллекциюНапример, такие, которые присваивают новое значение индексу или вставляют новый элемент в коллекцию, это приведение создало целый набор проблем.Я бы предположил, что у вашего MonitoredCollection<SomeObject>
экземпляра будет такой метод, как Add(SomeObject obj)
, который вставит новый объект в коллекцию.После приведения подпись для этого метода будет Add(ISomeInterface obj)
.Кажется, это имеет смысл, но не все ISomeInterface
объекты являются НЕОБХОДИМЫМИ SomeObject
экземплярами.
Поскольку приведенный объект будет разрешать операции с коллекцией, которые не разрешены исходным объектом, среда выполнения неразрешить этот актерский составВ C # 4.0 введены ковариация и контравариантность, чтобы явно указать, что является допустимым для приведений этого типа, вы можете изучить их для решения этой проблемы.Однако вам действительно повезет только с версией вашей коллекции, доступной только для чтения (подумайте List<T>.AsReadOnly()
).