一直在阅读并检查其他问题,但不明白/似乎无法在其他任何地方找到我的答案。
假设以下
Public Interface IAudit
Public Class FamilyAudit implements IAudit
Public Class MemberAudit implements IAudit
Public Class AuditPair(Of T As IAudit)
Dim myList as new List(of AuditPair(of IAudit))
Dim famAuditPair as new AuditPair(of FamilyAudit)
Dim memAuditPair as new AuditPair(of MemberAudit)
' This fails
myList.Add(famAuditPair)
myList.Add(memAuditPair)
我遇到编译错误,auditPairs无法隐式转换为AuditPair(IAudit)。这看起来像是共同/反对差异 MSDN文档说,因为4.0列表应该支持方差。
我错过了什么?
答案 0 :(得分:2)
新的in
/ out
差异功能特别适用于两种情况:
它不会将直接应用于具体类型列表List<T>
。而且,“列表”本质上是非变体的,因为“添加”和“枚举”在任一方向上都是互不相容的。但是,作为序列的列表是协变的。考虑:
var list = new List<FamilyAudit>();
IEnumerable<IAudit> seq = list; // <=== covariance; the list is
// IEnumerable<FamilyAudit>, which
// can be compatible with
// IEnumerable<IAudit>
请注意,这仅适用于.NET 4.0及更高版本;在早期版本中,它将拒绝编译,说:
无法将类型'System.Collections.Generic.List'隐式转换为'System.Collections.Generic.IEnumerable'。存在显式转换(您是否错过了演员?)
这是因为在4.0之前,界面是IEnumerable<T>
,而不是必要的IEnumerable<out T>
。