Допустим, у меня есть следующие классы, которые имеют разные реализации, основанные на объекте, который будет храниться:
public class ListOfPersistent<T> :
IList<T> where T : Persistent {... implementation ...}
public class ListOfNonPersistent<T> :
IList<T> {... implementation ...}
И я хочу использовать одну из других версий в вышеупомянутых классах, делая что-то вроде этого:
public class PersistentList<T> : IList<T> {
protected PersistentList() {
if (list != null) {
return;
}
if (Extensions.IsPersistent<T>()) {
list = new ListOfPersistent<T>();
} else {
list = new ListOfNonPersistent<T>();
}
}
protected IList<T> list;
....
}
Конечно, вышеупомянутое не компилируется, потому что есть ограничение типа на первый класс и нет на второй.Есть ли способ, которым я могу: Сказать компилятору, что он не должен проверять ограничение на этот конкретный случай (list = new ListOfPersistent<T>()
), потому что я ЗНАЮ, что он будет такого типа, или делать некоторую магию ковариации / контравариантности, чтобы код компилировался без каких-либо проблем