Out (ジェネリック修飾子) (Visual Basic)
ジェネリック型パラメーターの Out キーワードは、型が共変であることを指定します。
解説
共変性は、ジェネリック パラメーターによって指定された型よりも強い派生型を使用できるようにする機能です。 これにより、バリアント インターフェイスを実装するクラスの暗黙の型変換とデリゲート型の暗黙の型変換が可能となります。
詳細については、「共変性と反変性 (C# および Visual Basic)」を参照してください。
規則
Out キーワードは、ジェネリック インターフェイスとデリゲートで使用できます。
ジェネリック インターフェイスでは、次の条件を満たす場合に型パラメーターを共変と宣言できます。
型パラメーターがインターフェイス メソッドの戻り値の型としてのみ使用されてメソッド引数の型として使用されない。
注意
この規則には例外が 1 つあります。共変のインターフェイスで反変の汎用デリゲートをメソッド パラメーターとして使用する場合は、共変の型をこのデリゲートのジェネリック型パラメーターとして使用できます。共変および反変の汎用デリゲートの詳細については、「デリゲートの分散 (C# および Visual Basic)」および「Func および Action 汎用デリゲートでの分散の使用 (C# および Visual Basic)」を参照してください。
型パラメーターがインターフェイス メソッドのジェネリック制約として使用されない。
汎用デリゲートでは、メソッドの戻り値の型としてのみ使用されてメソッド引数の型として使用されない型パラメーターを共変と宣言できます。
共変性および反変性は参照型ではサポートされますが、値型ではサポートされません。
Visual Basic では、デリゲート型を指定せずに共変のインターフェイスのイベントを宣言することはできません。 また、共変のインターフェイスに入れ子になったクラス、列挙、または構造体を含めることはできませんが、これらに入れ子になったインターフェイスを含めることはできます。
[動作]
共変の型パラメーターを持つインターフェイスを使用すると、そのインターフェイスのメソッドは、型パラメーターによって指定された型よりも強い派生型を返すことができます。 たとえば、.NET Framework 4 の IEnumerable では T 型が共変なので、特別な変換メソッドを使用しなくても IEnumerabe(Of String) 型のオブジェクトを IEnumerable(Of Object) 型のオブジェクトに割り当てることができます。
共変のデリゲートには、型は同じだがより強い派生ジェネリック型パラメーターを持つ別のデリゲートを割り当てることができます。
使用例
共変のジェネリック インターフェイスを宣言、拡張、および実装する方法を次の例に示します。 また、共変のインターフェイスを実装するクラスの暗黙の型変換を使用する方法も示します。
' 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
共変の汎用デリゲートを宣言、インスタンス化、および起動する方法を次の例に示します。 また、デリゲート型に暗黙の型変換を使用する方法も示します。
' 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