Out(泛型修饰符)(Visual Basic)

对于泛型类型参数,Out 关键字可指定类型是协变的。

注解

协变使你使用的类型可以比泛型参数指定的类型派生程度更大。 这样可以隐式转换实现变体接口的类以及隐式转换委托类型。

有关详细信息,请参阅协变和逆变

规则

可以在泛型接口和委托中使用 Out 关键字。

在泛型接口中,如果类型参数满足以下条件,则可以声明为协变:

  • 类型参数只用作接口方法的返回类型,而不用作方法参数的类型。

    注意

    此规则有一个例外。 如果在协变接口中将逆变泛型委托用作方法参数,则可以将协变类型用作此委托的泛型类型参数。 有关协变和逆变泛型委托的详细信息,请参阅委托中的变体对 Func 和 Action 泛型委托使用变体

  • 类型参数不用作接口方法的泛型约束。

在泛型委托中,如果类型参数仅用作方法返回类型,而不用于方法参数,则可以声明为协变。

引用类型支持协变和逆变,但值类型不支持它们。

在 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

请参阅