假设我有以下类,它们根据要存储的对象具有不同的实现:
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>()
),因为我知道它会是那种类型,或者做一些协变/逆变魔法,这样代码编译没有任何问题?