.net - 与 List(of AType(of T)) 的协方差,其中 T 是接口(interface)

标签 .net vb.net covariance

一直在阅读和检查其他问题,但不明白/似乎无法在其他地方找到我的答案。

假设如下

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 开始,列表应该支持方差。

我错过了什么?

最佳答案

新的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 及更高版本;在早期版本中,它将拒绝编译,并表示:

Cannot implicitly convert type 'System.Collections.Generic.List' to 'System.Collections.Generic.IEnumerable'. An explicit conversion exists (are you missing a cast?)

那是因为4.0之前,接口(interface)是IEnumerable<T> ,而不是必要的IEnumerable<out T> .

关于.net - 与 List(of AType(of T)) 的协方差,其中 T 是接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13601320/

相关文章:

.net - 如何隐藏模块中的 Object.Equals() 方法?

html - 如何使用 VB.net 获取 html 页面的源代码?

c++ - 从类模板实现纯虚函数 - 参数类型

.net - 更新 Windows 服务

.net - 在 .NET 4 中结合使用遗留安全策略和动态操作

c# - .NET Remoting 被 WCF 取代了吗?

vb.net - 查找面板中最顶层(z 顺序)的控件

java - 协变返回类型最佳实践

java - 为什么 Java 中的逆变参数类型不允许重写?

c# - 在c#中向多维数组添加维度