Out (modyfikator ogólny) (Visual Basic)

W przypadku parametrów typu ogólnego słowo kluczowe określa, Out że typ jest kowariantny.

Uwagi

Kowariancja umożliwia użycie bardziej pochodnego typu niż określony przez parametr ogólny. Umożliwia to niejawną konwersję klas, które implementują interfejsy wariantów i niejawną konwersję typów delegatów.

Aby uzyskać więcej informacji, zobacz Covariance i Contravariance.

Reguły

Słowo kluczowe można użyć Out w interfejsach ogólnych i delegatach.

W interfejsie ogólnym parametr typu można zadeklarować kowariantnie, jeśli spełnia następujące warunki:

W delegatu ogólnym parametr typu może być zadeklarowany kowariantnie, jeśli jest używany tylko jako typ zwracany metody i nie jest używany dla argumentów metody.

Kowariancja i kontrawariancja są obsługiwane w przypadku typów odwołań, ale nie są obsługiwane dla typów wartości.

W języku Visual Basic nie można deklarować zdarzeń w interfejsach kowariantnych bez określania typu delegata. Ponadto interfejsy kowariantne nie mogą mieć zagnieżdżonych klas, wyliczenia ani struktur, ale mogą mieć zagnieżdżone interfejsy.

Zachowanie

Interfejs, który ma kowariantny parametr typu, umożliwia jego metodom zwracanie większej liczby typów pochodnych niż te określone przez parametr typu. Na przykład, ponieważ w programie .NET Framework 4 typ T jest kowariantny, IEnumerable<T>można przypisać obiekt typu do obiektu IEnumerable(Of String)IEnumerable(Of Object) typu bez użycia żadnych specjalnych metod konwersji.

Delegat kowariantny może mieć przypisany inny delegat tego samego typu, ale z bardziej pochodnym parametrem typu ogólnego.

Przykład 1

W poniższym przykładzie pokazano, jak deklarować, rozszerzać i implementować kowariantny interfejs ogólny. Pokazano również, jak używać niejawnej konwersji dla klas implementujących kowariantny interfejs.

' 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

Przykład 2

W poniższym przykładzie pokazano, jak zadeklarować, utworzyć wystąpienie i wywołać współwariantnego delegata ogólnego. Pokazuje również, jak można użyć niejawnej konwersji dla typów delegatów.

' 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

Zobacz też