c# - 无法从 Derived<Derived 2T> 转换为 BaseT<base 2T>

标签 c# .net generics .net-4.0 variance

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

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/

相关文章:

c# - 为什么 SqlConnection 在强制执行 .Close() 和 using(...) 后仍然打开?

c# - 保存 1 位深度的 TIF 的最佳 Web 可视格式是什么?

.net - System.Threading.Monitor.Enter()如何工作?

java - 编译器如何推断 Java 泛型中的类型

c# - 用于测试任何委托(delegate)的性能的通用函数

java: 无法推断 MaxHeap<> 的类型参数

c# - 设计决策: MVVM and WPF with two Views?

c# - 如何向工厂模式添加新的派生类型?

c# - 通过 TCP 处理客户端/服务器通信 - 一般问题

c# - 为什么我在调用 DbDataAdapter.Update 时使用 ODP.NET OracleDataAdapter 而不是使用 System.Data.OracleClient 的适配器获得 OracleTruncateException?