ジェネリック型パラメーターの場合、 In
キーワードは、型パラメーターが反変であることを指定します。
注釈
反変性を使用すると、ジェネリック パラメーターで指定された型よりも派生型を使用できます。 これにより、バリアント インターフェイスを実装するクラスの暗黙的な変換とデリゲート型の暗黙的な変換が可能になります。
詳細については、「 共変性と反変性」を参照してください。
準則
ジェネリック インターフェイスとデリゲートでは、 In
キーワードを使用できます。
型パラメーターは、メソッド引数の型としてのみ使用され、メソッドの戻り値の型として使用されない場合は、ジェネリック インターフェイスまたはデリゲートで反変として宣言できます。
ByRef
パラメーターを共変または反変にすることはできません。
共変性と反変性は参照型でサポートされており、値型ではサポートされていません。
Visual Basic では、デリゲート型を指定しないと、反変インターフェイスでイベントを宣言することはできません。 また、反変インターフェイスは、入れ子になったクラス、列挙型、または構造体を持つことはできませんが、入れ子になったインターフェイスを持つことができます。
行動
反変型パラメーターを持つインターフェイスを使用すると、そのメソッドは、インターフェイス型パラメーターで指定された型よりも派生型の少ない引数を受け取ることができます。 たとえば、.NET Framework 4 では、IComparer<T> インターフェイスでは T 型が反変であるため、Employee
がPerson
から継承する場合、特別な変換メソッドを使用せずに、IComparer(Of Person)
型のオブジェクトをIComparer(Of Employee)
型のオブジェクトに割り当てることができます。
反変デリゲートには、同じ型の別のデリゲートを割り当てることができますが、ジェネリック型パラメーターの派生が少なくなります。
例 - 反変ジェネリック インターフェイス
次の例は、反変ジェネリック インターフェイスを宣言、拡張、実装する方法を示しています。 また、このインターフェイスを実装するクラスに暗黙的な変換を使用する方法も示します。
' Contravariant interface.
Interface IContravariant(Of In A)
End Interface
' Extending contravariant interface.
Interface IExtContravariant(Of In A)
Inherits IContravariant(Of A)
End Interface
' Implementing contravariant interface.
Class Sample(Of A)
Implements IContravariant(Of A)
End Class
Sub Main()
Dim iobj As IContravariant(Of Object) = New Sample(Of Object)()
Dim istr As IContravariant(Of String) = New Sample(Of String)()
' You can assign iobj to istr, because
' the IContravariant interface is contravariant.
istr = iobj
End Sub
例 - 反変ジェネリック デリゲート
次の例は、反変ジェネリック デリゲートを宣言、インスタンス化、および呼び出す方法を示しています。 また、デリゲート型を暗黙的に変換する方法も示します。
' Contravariant delegate.
Public Delegate Sub DContravariant(Of In A)(ByVal argument As A)
' Methods that match the delegate signature.
Public Shared Sub SampleControl(ByVal control As Control)
End Sub
Public Shared Sub SampleButton(ByVal control As Button)
End Sub
Private Sub Test()
' Instantiating the delegates with the methods.
Dim dControl As DContravariant(Of Control) =
AddressOf SampleControl
Dim dButton As DContravariant(Of Button) =
AddressOf SampleButton
' You can assign dControl to dButton
' because the DContravariant delegate is contravariant.
dButton = dControl
' Invoke the delegate.
dButton(New Button())
End Sub
こちらも参照ください
.NET