共用方式為


Out (泛型修飾詞) (Visual Basic)

若為泛型型別參數,Out 關鍵字會指定型別是 Covariant。

備註

共變數可讓您使用比泛型參數指定的衍生程度更高的衍生型別。 這可隱含轉換實作 variant 介面的類別和隱含轉換委派類型。

如需詳細資訊,請參閱 Covariance and Contravariance (共變數和反變數 (C# 和 Visual Basic))。

規則

您可以在泛型介面及委派中使用 Out 關鍵字。

在泛型介面中,型別參數如果滿足下列條件即可宣告為 Covariant︰

  • 型別參數僅用為介面方法的傳回型別,不用為方法引數的型別。

    注意

    這個規則只有一個例外。 如果您在 Covariant 介面中以 Contravariant 泛型委派作為方法參數,則可將 Covariant 型別用為此委派的泛型型別參數。 如需 Covariant 和 Contravariant 泛型委派的詳細資訊,請參閱 Variance in Delegates (委派中的變異數) 和 Using Variance for Func and Action Generic Delegates (針對 Func 與 Action 委派使用變異數)。

  • 型別參數不是用為介面方法的泛型條件約束。

在泛型委派中,如果型別參數只用為方法傳回型別,不用於方法引數,則可以宣告為 Covariant。

參考型別支援共變數和反變數,但實值型別不支援它們。

在 Visual Basic 中,您無法在 Covariant 介面中宣告事件,而不需要指定委派型別。 此外,Covariant 介面不能有巢狀類別、列舉或結構,但可以有巢狀介面。

行為

具有 Covariant 型別參數的介面可讓其方法傳回的衍生型別,衍生程度高過型別參數指定的衍生型別。 例如,因為在 .NET Framework 4 的 IEnumerable<T> 中,T 類型是 Covariant,所以您可以不使用任何特殊的轉換方法,將 IEnumerable(Of String) 類型的物件指派給 IEnumerable(Of Object) 類型的物件。

Covariant 委派可以指派給同型別的另一個委派,但具有衍生程度較大的泛型型別參數。

範例 1

下例會示範如何宣告、擴充及實作 Covariant 泛型介面。 它也會示範如何針對實作 Covariant 介面的類別使用隱含轉換。

' 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 泛型委派。 也會示範如何對委派型別使用隱含轉換。

' 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

另請參閱