Dela via


Ut (allmän modifierare) (Visual Basic)

För generiska typparametrar anger nyckelordet Out att typen är covariant.

Kommentarer

Med kovarians kan du använda en mer härledd typ än den som anges av den generiska parametern. Detta möjliggör implicit konvertering av klasser som implementerar variantgränssnitt och implicit konvertering av ombudstyper.

Mer information finns i Covariance och Contravariance.

Regler

Du kan använda nyckelordet Out i allmänna gränssnitt och ombud.

I ett allmänt gränssnitt kan en typparameter deklareras som covariant om den uppfyller följande villkor:

  • Typparametern används endast som en returtyp av gränssnittsmetoder och används inte som en typ av metodargument.

    Kommentar

    Det finns ett undantag till den här regeln. Om du i ett covariant-gränssnitt har ett kontravariant generiskt ombud som en metodparameter kan du använda covarianttypen som en allmän typparameter för det här ombudet. Mer information om covarianta och kontravarianta generiska ombud finns i Varians i Ombud och Använda varians för Func- och Action Generic Delegates.

  • Typparametern används inte som en allmän begränsning för gränssnittsmetoderna.

I ett allmänt ombud kan en typparameter deklareras som covariant om den endast används som en metodreturtyp och inte används för metodargument.

Kovarians och kontravarians stöds för referenstyper, men de stöds inte för värdetyper.

I Visual Basic kan du inte deklarera händelser i samvarianta gränssnitt utan att ange ombudstypen. Dessutom kan covariantgränssnitt inte ha kapslade klasser, uppräkningar eller strukturer, men de kan ha kapslade gränssnitt.

Funktionssätt

Ett gränssnitt som har en parameter av typen covariant gör det möjligt för dess metoder att returnera fler härledda typer än de som anges av typparametern. Eftersom du till exempel i .NET Framework 4, i IEnumerable<T>, skriver T är covariant, kan du tilldela ett objekt av IEnumerable(Of String) typen till ett objekt av IEnumerable(Of Object) typen utan att använda några särskilda konverteringsmetoder.

Ett covariant-ombud kan tilldelas ett annat ombud av samma typ, men med en mer härledd generisk typparameter.

Exempel 1

I följande exempel visas hur du deklarerar, utökar och implementerar ett allmänt samvariant gränssnitt. Den visar också hur du använder implicit konvertering för klasser som implementerar ett covariant-gränssnitt.

' 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

Exempel 2

I följande exempel visas hur du deklarerar, instansierar och anropar ett allmänt ombud med kovvariant. Den visar också hur du kan använda implicit konvertering för ombudstyper.

' 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

Se även