ジェネリック型パラメーターの場合、 Out
キーワードは、型が共変であることを指定します。
注釈
共分散を使用すると、ジェネリック パラメーターで指定された型よりも多くの派生型を使用できます。 これにより、バリアント インターフェイスを実装するクラスの暗黙的な変換とデリゲート型の暗黙的な変換が可能になります。
詳細については、「 共変性と反変性」を参照してください。
準則
ジェネリック インターフェイスとデリゲートでは、 Out
キーワードを使用できます。
ジェネリック インターフェイスでは、次の条件を満たす場合、型パラメーターを共変として宣言できます。
型パラメーターは、インターフェイス メソッドの戻り値の型としてのみ使用され、メソッド引数の型として使用されません。
注
この規則には 1 つの例外があります。 共変インターフェイスで反変ジェネリック デリゲートをメソッド パラメーターとして使用する場合は、このデリゲートのジェネリック型パラメーターとして共変型を使用できます。 共変ジェネリック デリゲートと反変ジェネリック デリゲートの詳細については、「Func および Action Generic Delegate のデリゲートの分散と分散の使用」を参照してください。
型パラメーターは、インターフェイス メソッドのジェネリック制約として使用されません。
ジェネリック デリゲートでは、メソッドの戻り値の型としてのみ使用され、メソッド引数には使用されない場合、型パラメーターを共変として宣言できます。
参照型では共変性と反変性がサポートされていますが、値型ではサポートされていません。
Visual Basic では、デリゲート型を指定せずに共変インターフェイスでイベントを宣言することはできません。 また、共変インターフェイスは、入れ子になったクラス、列挙型、または構造体を持つことはできませんが、入れ子になったインターフェイスを持つことができます。
行動
共変型パラメーターを持つインターフェイスを使用すると、そのメソッドは型パラメーターで指定された型よりも多くの派生型を返します。 たとえば、.NET Framework 4 では、 IEnumerable<T>では T 型が共変であるため、特別な変換メソッドを使用せずに、 IEnumerable(Of String)
型のオブジェクトを IEnumerable(Of Object)
型のオブジェクトに割り当てることができます。
共変デリゲートには、同じ型の別のデリゲートを割り当てることができますが、より派生したジェネリック型パラメーターを使用できます。
例 1
次の例は、共変ジェネリック インターフェイスを宣言、拡張、実装する方法を示しています。 また、共変インターフェイスを実装するクラスに暗黙的な変換を使用する方法も示します。
' Covariant interface.
Interface ICovariant(Of Out R)
End Interface
' Extending covariant interface.
Interface IExtCovariant(Of Out R)
Inherits ICovariant(Of R)
End Interface
' Implementing covariant interface.
Class Sample(Of R)
Implements ICovariant(Of R)
End Class
Sub Main()
Dim iobj As ICovariant(Of Object) = New Sample(Of Object)()
Dim istr As ICovariant(Of String) = New Sample(Of String)()
' You can assign istr to iobj because
' the ICovariant interface is covariant.
iobj = istr
End Sub
例 2
次の例は、共変のジェネリック デリゲートを宣言、インスタンス化、および呼び出す方法を示しています。 また、デリゲート型に暗黙的な変換を使用する方法も示します。
' Covariant delegate.
Public Delegate Function DCovariant(Of Out R)() As R
' Methods that match the delegate signature.
Public Shared Function SampleControl() As Control
Return New Control()
End Function
Public Shared Function SampleButton() As Button
Return New Button()
End Function
Private Sub Test()
' Instantiating the delegates with the methods.
Dim dControl As DCovariant(Of Control) =
AddressOf SampleControl
Dim dButton As DCovariant(Of Button) =
AddressOf SampleButton
' You can assign dButton to dControl
' because the DCovariant delegate is covariant.
dControl = dButton
' Invoke the delegate.
dControl()
End Sub
こちらも参照ください
.NET