Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Voor algemene typeparameters geeft het out trefwoord aan dat de typeparameter covariant is. Gebruik het out trefwoord in algemene interfaces en gemachtigden.
Met covariantie kunt u een meer afgeleid type gebruiken dan de algemene parameter specificeert. Met deze functie kunt u impliciete conversie van klassen uitvoeren waarmee covariantinterfaces en impliciete conversie van gedelegeerde typen worden geïmplementeerd. Covariantie en contravariantie bieden ondersteuning voor referentietypen, maar bieden geen ondersteuning voor waardetypen.
Met een interface met een parameter voor het covarianttype kunnen de methoden meer afgeleide typen retourneren dan de typen die zijn opgegeven door de typeparameter. Omdat in .NET, in .NET, type IEnumerable<T>T covariant is, kunt u bijvoorbeeld een object van het IEnumerable<string> type toewijzen aan een object van het IEnumerable<object> type zonder speciale conversiemethoden te gebruiken.
U kunt een covariant gedelegeerde toewijzen aan een andere gemachtigde van hetzelfde type, maar met een meer afgeleide algemene typeparameter.
Zie Covariantie en Contravariantie voor meer informatie.
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#.
In het volgende voorbeeld ziet u hoe u een algemene covariant-interface declareert, uitbreidt en implementeert. Ook ziet u hoe u impliciete conversie gebruikt voor klassen die een covariant-interface implementeren.
// 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;
}
}
Declareer in een algemene interface een typeparameter covariant als deze voldoet aan de volgende voorwaarden:
U gebruikt de typeparameter alleen als retourtype interfacemethoden en gebruikt deze niet als een type methodeargumenten.
Opmerking
Er is één uitzondering op deze regel. Als een covariant-interface een algemene gemachtigde heeft als methodeparameter, kunt u het covarianttype gebruiken als een algemene typeparameter voor deze gemachtigde. Voor meer informatie over covariant en contravariant algemene gemachtigden raadpleegt u Variantie in Gemachtigden en Variantie gebruiken voor Algemene gedelegeerden voor Func en Actie algemene gedelegeerden.
U gebruikt de typeparameter niet als een algemene beperking voor de interfacemethoden.
In het volgende voorbeeld ziet u hoe u een algemene gemachtigde voor covariant declareert, instantiëren en aanroept. Het laat ook zien hoe u impliciet gedelegeerde typen converteert.
// 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();
}
Declareer in een algemene gemachtigde een type covariant als u deze alleen gebruikt als retourtype methode en niet voor methodeargumenten.
C#-taalspecificatie
Zie de C#-taalspecificatie voor meer informatie. De taalspecificatie is de definitieve bron voor de C#-syntaxis en het gebruik.