我有这些类,事件记录模式的实现:
public abstract class RecordCollection<T> : ObservableCollection<T> where T : Record
public abstract class Record : INotifyPropertyChanged
每次我想定义数据库的一行(即联系人)时,我都会创建一个新的记录类,例如:
public class Contact : Record
以及数据库行(即联系人)的集合:
public class ContactCollection : RecordCollection<Contact>
但之后我不能使用通用来包含记录集合:
ContactCollection contColl = new ContactCollection(databaseman dbMan);
contColl.Load();
RecordCollection<Record> recordColl = contColl;
它给我“无法将类型 ContactCollection 隐式转换为 >”。任何帮助将不胜感激。
最佳答案
不允许进行此转换,因为这可能会发生:
public class AnotherTypeOfContact: Record {}
现在我们可以做:
recordColl.Add(new AnotherTpyeOfContact()) //runtime exception as no conversion between AnotherTypeOfContact and Contact
这就是泛型类型之间的协方差和逆变 ( read more here )。为此,contColl
必须实现一个仅“输出”的接口(interface),但事实并非如此。我的意思是,为了保留类型安全,contColl
不允许添加项目(更正式地说,T
只能是方法的返回类型)
请注意,在数组中这是允许的,但它是一个破坏的协方差,这是不幸的:more here
关于c# - 无法从 Derived<Derived 2T> 转换为 BaseT<base 2T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6478937/