Я пытаюсь создать список WeakReference
с использованием обобщенной версии 4.5, чтобы я мог избежать проверки типов и литья цели WeakReference
. Но WeakReference<T>
, похоже, не поддерживает ковариацию, поэтому я пытаюсь установить обходной путь.Могу ли я создать список <WeakReference <T>>?
Я думаю, что это должно быть выполнимым, поскольку каждый Т будет иметь тип в определенной цепочке наследования. Итак, что я имею в виду бы вдоль этих линий:
public class Animal { }
public class Tiger : Animal { }
public class Wolf : Animal { }
var mylist = new List<WeakReference<Animal>>();
mylist.Add(new WeakReference<Animal>(new Animal()));
mylist.Add(new WeakReference<Tiger>(new Tiger()));
mylist.Add(new WeakReference<Wolf>(new Wolf()));
Я попытался создать класс-оболочку для WeakReference (так как это не-наследуемым), но это не работает. Независимо от того, что, список не примет никаких напечатанных WeakReference
кроме WeakReference<Animal>
.
Я мог бы создать свою собственную общую реализацию WeakReference
, но это, казалось бы, побеждало бы точку, так как я буду делать литье типов внутри нее. Я не могу найти какую-либо документацию, но я предполагаю, что версия фреймворка справляется с этим лучше.
Есть ли другой способ справиться с этим, о котором я не думаю, или я лаю неправильное дерево?
'WeakReference' не определяет общий параметр 'T' как ковариантный; вы можете добавить 'new WeakReference (новый Wolf())' в свою коллекцию. –
Классы никогда не ковариантны; могут быть только интерфейсы и делегаты. И вообще, 'WeakReference' не может быть ковариантным, так как 'T' отображается как в позиции ввода, так и на выходе. –