2

我有这些类,活动记录模式的实现:

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 类型隐式转换为 >”。任何帮助,将不胜感激。

4

1 回答 1

6

这种强制转换是不允许的,因为这可能会发生:

public class AnotherTypeOfContact: Record {}

现在我们可以这样做:

recordColl.Add(new AnotherTpyeOfContact()) //runtime exception as no conversion between AnotherTypeOfContact and Contact

这就是泛型类型之间所谓的协变逆变在此处阅读更多内容)。为此,contColl必须实现一个仅“输出”的接口,但它没有。我的意思是为了保持类型安全,contColl不能允许添加项目(更正式地说,T只能是方法的返回类型)

请注意,在数组中这允许的,但它是一个损坏的协方差,这是不幸的:更多在这里

于 2011-06-25T16:20:42.247 回答