2

他の質問を読んでチェックしていますが、理解できない/他のどこにも私の答えが見つからないようです.

次のことを前提とします

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 を (IAudit の) AuditPair に暗黙的に変換できないというコンパイラ エラーが発生します。これは、コ/コントラ分散のように見えます。
MSDN のドキュメントによると、4.0 以降のリストは分散をサポートする必要があります。

私は何が欠けていますか?

4

1 に答える 1

2

新規in/outバリアンス機能は、特に次の 2 つのシナリオに適用されます。

  • インターフェイス
  • 代議員

具体的な型 list には直接適用されません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>です。

于 2012-11-28T09:17:40.207 に答える