In (ジェネリック修飾子) (Visual Basic)
ジェネリック型パラメーターの In キーワードは、型パラメーターが反変であることを指定します。
解説
反変性は、ジェネリック パラメーターによって指定された型よりも弱い派生型を使用できるようにする機能です。これにより、バリアント インターフェイスを実装するクラスの暗黙の型変換とデリゲート型の暗黙の型変換が可能となります。
詳細については、「共変性と反変性 (C# および Visual Basic)」を参照してください。
規則
In キーワードは、ジェネリック インターフェイスとデリゲートで使用できます。
型パラメーターは、メソッド引数の型としてのみ使用されてメソッドの戻り値の型として使用されない場合に、ジェネリック インターフェイスまたは汎用デリゲートで反変であることを宣言できます。ByRef パラメーターは、共変または反変にすることはできません。
共変性および反変性は参照型でサポートされ、値の型ではサポートされません。
Visual Basic では、デリゲート型を指定せずに、反変インターフェイスのイベントを宣言することはできません。また、反変インターフェイスに入れ子になったクラス、列挙、または構造体を含めることはできませんが、これらに入れ子になったインターフェイスを含めることはできます。
[動作]
反変の型パラメーターを持つインターフェイスを使用すると、そのインターフェイスのメソッドは、インターフェイスの型パラメーターによって指定された型よりも弱い派生型の引数を受け取ることができます。たとえば、.NET Framework 4 の IComparer<T> インターフェイスでは T 型が反変なので、Person が Employee を継承する場合、特別な変換メソッドを使用しなくても 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
参照
関連項目
Out (ジェネリック修飾子) (Visual Basic)