Share via


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

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

Med kontravarians kan du använda en mindre härledd typ än den som anges av den generiska parametern. Detta möjliggör implicit konvertering av klasser som implementerar kontravarianta gränssnitt och implicit konvertering av ombudstyper. Kovarians och kontravarians i generiska typparametrar stöds för referenstyper, men de stöds inte för värdetyper.

En typ kan förklaras som kontravariant i ett allmänt gränssnitt eller ombud endast om den definierar typen av en metodparametrar och inte av en metods returtyp. In, ref, och out parametrarna måste vara invarianta, vilket innebär att de varken är covarianta eller kontravarianta.

Med ett gränssnitt som har en parameter av typen contravariant kan dess metoder acceptera argument av mindre härledda typer än de som anges av parametern för gränssnittstyp. I gränssnittet skriver du t är kontravariant. Du kan till exempel IComparer<T> tilldela ett objekt av IComparer<Person> typen till ett objekt av IComparer<Employee> typen utan att använda några särskilda konverteringsmetoder om Employee ärver Person.

Ett kontravariant ombud kan tilldelas ett annat ombud av samma typ, men med en mindre härledd generisk typparameter.

Mer information finns i Covariance och Contravariance.

Kontravariant generiskt gränssnitt

I följande exempel visas hur du deklarerar, utökar och implementerar ett kontravariant generiskt gränssnitt. Den visar också hur du kan använda implicit konvertering för klasser som implementerar det här gränssnittet.

// Contravariant interface.
interface IContravariant<in A> { }

// Extending contravariant interface.
interface IExtContravariant<in A> : IContravariant<A> { }

// Implementing contravariant interface.
class Sample<A> : IContravariant<A> { }

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

        // You can assign iobj to istr because
        // the IContravariant interface is contravariant.
        istr = iobj;
    }
}

Kontravariant allmän delegat

I följande exempel visas hur du deklarerar, instansierar och anropar en kontravariant allmän delegat. Den visar också hur du implicit kan konvertera en ombudstyp.

// Contravariant delegate.
public delegate void DContravariant<in A>(A argument);

// Methods that match the delegate signature.
public static void SampleControl(Control control)
{ }
public static void SampleButton(Button button)
{ }

public void Test()
{

    // Instantiating the delegates with the methods.
    DContravariant<Control> dControl = SampleControl;
    DContravariant<Button> dButton = SampleButton;

    // You can assign dControl to dButton
    // because the DContravariant delegate is contravariant.
    dButton = dControl;

    // Invoke the delegate.
    dButton(new Button());
}

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