Dela via


out (allmän modifierare) (C#-referens)

För generiska typparametrar anger nyckelordet out att typparametern är samvariant. Du kan använda nyckelordet out i allmänna gränssnitt och ombud.

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 covariant-gränssnitt och implicit konvertering av ombudstyper. Kovarians och kontravarians stöds för referenstyper, men de stöds inte för värdetyper.

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.

Mer information finns i Covariance och Contravariance.

Exempel – covariant generiskt gränssnitt

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<out R> { }

// Extending covariant interface.
interface IExtCovariant<out R> : ICovariant<R> { }

// Implementing covariant interface.
class Sample<R> : ICovariant<R> { }

class Program
{
    static void Test()
    {
        ICovariant<Object> iobj = new Sample<Object>();
        ICovariant<String> istr = new Sample<String>();

        // You can assign istr to iobj because
        // the ICovariant interface is covariant.
        iobj = istr;
    }
}

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.

Exempel – kovariant allmänt ombud

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

// Covariant delegate.
public delegate R DCovariant<out R>();

// Methods that match the delegate signature.
public static Control SampleControl()
{ return new Control(); }

public static Button SampleButton()
{ return new Button(); }

public void Test()
{
    // Instantiate the delegates with the methods.
    DCovariant<Control> dControl = SampleControl;
    DCovariant<Button> dButton = SampleButton;

    // You can assign dButton to dControl
    // because the DCovariant delegate is covariant.
    dControl = dButton;

    // Invoke the delegate.
    dControl();
}

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

Språkspecifikation för C#

Mer information finns i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.

Se även