gpt4 book ai didi

c# - 无法从 Derived 转换为 BaseT

转载 作者:行者123 更新时间:2023-12-01 22:46:56 27 4
gpt4 key购买 nike

我有这些类,事件记录模式的实现:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com