次の方法で共有


共変性と反変性 (Visual Basic)

Visual Basic では、共変性と反変性により、配列型、デリゲート型、ジェネリック型引数の暗黙的な参照変換が可能になります。 共変性では割り当ての互換性が維持され、反変性によって逆になります。

次のコードは、代入の互換性、共変性、反変性の違いを示しています。

' Assignment compatibility.
Dim str As String = "test"
' An object of a more derived type is assigned to an object of a less derived type.
Dim obj As Object = str

' Covariance.
Dim strings As IEnumerable(Of String) = New List(Of String)()
' An object that is instantiated with a more derived type argument
' is assigned to an object instantiated with a less derived type argument.
' Assignment compatibility is preserved.
Dim objects As IEnumerable(Of Object) = strings

' Contravariance.
' Assume that there is the following method in the class:
' Shared Sub SetObject(ByVal o As Object)
' End Sub
Dim actObject As Action(Of Object) = AddressOf SetObject

' An object that is instantiated with a less derived type argument
' is assigned to an object instantiated with a more derived type argument.
' Assignment compatibility is reversed.
Dim actString As Action(Of String) = actObject

配列の共分散により、より派生型の配列を、より派生の少ない型の配列に暗黙的に変換できます。 ただし、次のコード例に示すように、この操作はタイプ セーフではありません。

Dim array() As Object = New String(10) {}
' The following statement produces a run-time exception.
' array(0) = 10

メソッド グループの共変性と反変性のサポートにより、メソッド シグネチャをデリゲート型と照合できます。 この照合により、一致するシグネチャを持つメソッドだけでなく、次のメソッドもデリゲートに割り当てることができます。

  • デリゲート型で指定された戻り値の型よりも多くの派生型 (共分散) を返します。
  • デリゲート型で指定された型よりも派生型 (反変性) が少ないパラメーターを受け入れます。

詳細については、「 デリゲートの分散 (Visual Basic)」 および「 デリゲートでの分散の使用 (Visual Basic)」を参照してください。

次のコード例は、メソッド グループの共変性と反変性のサポートを示しています。

Shared Function GetObject() As Object
    Return Nothing
End Function

Shared Sub SetObject(ByVal obj As Object)
End Sub

Shared Function GetString() As String
    Return ""
End Function

Shared Sub SetString(ByVal str As String)

End Sub

Shared Sub Test()
    ' Covariance. A delegate specifies a return type as object,
    ' but you can assign a method that returns a string.
    Dim del As Func(Of Object) = AddressOf GetString

    ' Contravariance. A delegate specifies a parameter type as string,
    ' but you can assign a method that takes an object.
    Dim del2 As Action(Of String) = AddressOf SetObject
End Sub

.NET Framework 4 以降では、Visual Basic はジェネリック インターフェイスとデリゲートの共変性と反変性をサポートし、ジェネリック型パラメーターの暗黙的な変換を可能にします。 詳細については、「 ジェネリック インターフェイスの分散 (Visual Basic)」 および「 デリゲートの分散 (Visual Basic)」を参照してください。

次のコード例は、ジェネリック インターフェイスの暗黙的な参照変換を示しています。

Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings

ジェネリック パラメーターが共変または反変として宣言されている場合、ジェネリック インターフェイスまたはデリゲートは バリアント 型と呼ばれます。 Visual Basic では、独自のバリアント インターフェイスとデリゲートを作成できます。 詳細については、「 バリアント ジェネリック インターフェイスの作成 (Visual Basic) 」および「 デリゲートの分散 (Visual Basic)」を参照してください。

タイトル 説明
ジェネリック インターフェイスの分散 (Visual Basic) ジェネリック インターフェイスの共変性と反変性について説明し、.NET Framework のバリアント ジェネリック インターフェイスの一覧を提供します。
バリアント ジェネリック インターフェイスの作成 (Visual Basic) カスタムバリアントインターフェイスを作成する方法を示します。
ジェネリック コレクションのインターフェイスでの分散の使用 (Visual Basic) IEnumerable<T>インターフェイスとIComparable<T> インターフェイスでの共変性と反変性のサポートがコードの再利用にどのように役立つかを示します。
デリゲートの分散 (Visual Basic) ジェネリック デリゲートと非ジェネリック デリゲートの共変性と反変性について説明し、.NET Framework のバリアント ジェネリック デリゲートの一覧を提供します。
デリゲートでの分散の使用 (Visual Basic) 非ジェネリック デリゲートで共変性と反変性のサポートを使用して、メソッドシグネチャとデリゲート型を照合する方法を示します。
Func デリゲートと Action 汎用デリゲートの分散の使用 (Visual Basic) FuncおよびActionデリゲートでの共変性と反変性のサポートがコードの再利用にどのように役立つかを示します。