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:
Parametr typu jest używany tylko jako zwracany typ metod interfejsu i nie jest używany jako typ argumentów metody.
Uwaga
Istnieje jeden wyjątek od tej reguły. Jeśli w interfejsie kowariantnym masz kontrawariantnego delegata ogólnego jako parametr metody, możesz użyć kowariantnego typu jako ogólnego parametru typu dla tego delegata. Aby uzyskać więcej informacji na temat kowariantnych i kontrawariantnych delegatów ogólnych, zobacz Variance in Delegates (Odchylenie w delegatach) i Using Variance for Func and Action Generic Delegates (Odchylenie w delegatach) i Using Variance for Func and Action Generic Delegates (Wariancja w delegatach ogólnych).
Parametr typu nie jest używany jako ograniczenie ogólne dla metod interfejsu.
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