Delen via


in (Algemene modifier) (C#-verwijzing)

Voor algemene typeparameters gebruikt u het in trefwoord om contravarianttypeargumenten toe te staan. Gebruik het in trefwoord in algemene interfaces en gemachtigden.

De C#-taalreferentiedocumenten beschrijven de meest recent uitgebrachte versie van de C#-taal. Het bevat ook de eerste documentatie voor functies in openbare previews voor de aanstaande taalrelease.

De documentatie identificeert alle functies die voor het eerst zijn geïntroduceerd in de laatste drie versies van de taal of in de huidige openbare previews.

Aanbeveling

Raadpleeg het artikel over de versiegeschiedenis van de C#-taal om te achterhalen wanneer een functie voor het eerst is geïntroduceerd in C#.

Met Contravariantie kunt u een minder afgeleid type gebruiken dan het type dat is opgegeven door de algemene parameter. Met deze functie kunt u impliciete conversie van klassen uitvoeren die contravariantinterfaces en impliciete conversie van gedelegeerdentypen implementeren. Referentietypen ondersteunen covariantie en contravariantie in algemene typeparameters, maar waardetypen bieden geen ondersteuning voor deze functies.

U kunt een type alleen declareren als contravariant in een algemene interface of delegeren als deze het type parameters van een methode definieert en niet het retourtype van de methode. In, refen out parameters moeten invariant zijn, wat betekent dat ze geen covariant of contravariant zijn.

Met een interface met een parameter voor het contravarianttype kunnen de methoden argumenten accepteren van minder afgeleide typen dan de parameters die zijn opgegeven door de parameter van het interfacetype. Typ T bijvoorbeeld contravariant in de IComparer<T> interface. U kunt een object van het IComparer<Person> type toewijzen aan een object van het IComparer<Employee> type zonder speciale conversiemethoden te gebruiken als Employee dit Personwordt overgenomen.

U kunt een contravariant gedelegeerde toewijzen aan een andere gemachtigde van hetzelfde type, maar met een minder afgeleide algemene typeparameter.

Zie Covariantie en Contravariantie voor meer informatie.

Algemene interface contravariant

In het volgende voorbeeld ziet u hoe u een algemene interface voor contravariant declareert, uitbreidt en implementeert. U ziet ook hoe u impliciete conversie kunt gebruiken voor klassen die deze interface implementeren.

// 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;
    }
}

Contravariant algemene gemachtigde

In het volgende voorbeeld ziet u hoe u een algemene gemachtigde kunt declareren, instantiëren en aanroept. U ziet ook hoe u impliciet een type gedelegeerde kunt converteren.

// 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());
}

C#-taalspecificatie

Zie de C#-taalspecificatie voor meer informatie. De taalspecificatie is de definitieve bron voor de C#-syntaxis en het gebruik.

Zie ook