Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Operatoren voor typetests en cast-expressies - ,
Deze operators en expressies voeren typecontrole of typeconversie uit. De isoperator controleert of het runtimetype van een expressie compatibel is met een bepaald type. De asoperator converteert expliciet een expressie naar een bepaald type als het runtimetype compatibel is met dat type.
Cast-expressies voeren een expliciete conversie uit naar een doeltype. De typeofoperator verkrijgt het System.Type exemplaar voor een type.
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#.
De operator is
De is operator controleert of het uitvoeringstype van een expressieresultaat compatibel is met een bepaald type. De is operator test ook een expressieresultaat op basis van een patroon.
De expressie met de operator voor typetests is heeft het volgende formulier
E is T
Waar E is een expressie die een waarde retourneert en T de naam is van een type of een typeparameter.
E kan geen anonieme methode of lambda-expressie zijn.
De is operator retourneert true wanneer een expressieresultaat niet null is en een van de volgende voorwaarden waar is:
Het uitvoertijdtype van een expressieresultaat heeft een identiteitsconversie naar
T.Het uitvoeringstype van een expressieresultaat is afgeleid van het type
T, implementeert interfaceTof een andere impliciete verwijzingsconversie bestaat van daaruitT. Deze voorwaarde omvat overnamerelaties en interface-implementaties.Het uitvoeringstype van een expressieresultaat is een null-waardetype met het onderliggende type
Ten het Nullable<T>.HasValue istrue.Een boxingconversie of unboxingconversie bestaat van het uitvoeringstype van een expressieresultaat naar type
Tals de expressie geen exemplaar van eenref structis.
De is operator houdt geen rekening met door de gebruiker gedefinieerde conversies of impliciete spanconversies.
In het volgende voorbeeld ziet u dat de is operator retourneert true als het uitvoeringstijdtype van een expressieresultaat is afgeleid van een bepaald type, dat wil gezegd, er een verwijzingsconversie bestaat tussen typen:
public class Base { }
public class Derived : Base { }
public static class IsOperatorExample
{
public static void Main()
{
object b = new Base();
Console.WriteLine(b is Base); // output: True
Console.WriteLine(b is Derived); // output: False
object d = new Derived();
Console.WriteLine(d is Base); // output: True
Console.WriteLine(d is Derived); // output: True
}
}
In het volgende voorbeeld ziet u dat de is operator rekening houdt met conversies voor boksen en het opheffen van vakken, maar geen rekening houdt met numerieke conversies:
int i = 27;
Console.WriteLine(i is System.IFormattable); // output: True
object iBoxed = i;
Console.WriteLine(iBoxed is int); // output: True
Console.WriteLine(iBoxed is long); // output: False
Zie het hoofdstuk Conversies van de C#-taalspecificatie voor meer informatie over C#-conversies.
Typetests met patroonkoppeling
De is operator test ook een expressieresultaat op basis van een patroon. In het volgende voorbeeld ziet u hoe u een declaratiepatroon gebruikt om het uitvoeringstype van een expressie te controleren:
int i = 23;
object iBoxed = i;
int? jNullable = 7;
if (iBoxed is int a && jNullable is int b)
{
Console.WriteLine(a + b); // output 30
}
Zie Patronen voor meer informatie over de ondersteunde patronen.
De operator as
Gebruik de as operator om het resultaat van een expressie expliciet te converteren naar een bepaald verwijzings- of null-waardetype. Als de conversie niet mogelijk is, retourneert asde null operator . In tegenstelling tot een cast-expressie genereert de as operator nooit een uitzondering.
De expressie van het formulier
E as T
Waar E is een expressie die een waarde retourneert en T de naam van een type of een typeparameter is, levert hetzelfde resultaat op als
E is T ? (T)(E) : (T)null
Behalve dat E slechts eenmaal wordt geëvalueerd.
De as operator beschouwt alleen verwijzings-, null-, boks- en uitboxingconversies. U kunt de operator niet gebruiken om een door de as gebruiker gedefinieerde conversie uit te voeren. Gebruik een cast-expressie om een door de gebruiker gedefinieerde conversie uit te voeren.
In het volgende voorbeeld ziet u het gebruik van de as operator:
IEnumerable<int> numbers = new List<int>(){10, 20, 30};
IList<int> indexable = numbers as IList<int>;
if (indexable != null)
{
Console.WriteLine(indexable[0] + indexable[indexable.Count - 1]); // output: 40
}
Notitie
Zoals het voorgaande voorbeeld laat zien, moet u het resultaat van de as expressie vergelijken met null om te controleren of de conversie is geslaagd. U kunt de is operator beide gebruiken om te testen of de conversie slaagt en, als deze slaagt, het resultaat toe te wijzen aan een nieuwe variabele.
Cast-expressie
Met een cast-expressie van het formulier (T)E wordt het resultaat van de expressie E expliciet geconverteerd naar type T. Als er geen expliciete conversie bestaat van het type E naar type T, geeft de compiler een fout. Tijdens runtime slaagt een expliciete conversie mogelijk niet en kan een cast-expressie een uitzondering genereren.
In het volgende voorbeeld ziet u expliciete numerieke en verwijzingsconversies:
double x = 1234.7;
int a = (int)x;
Console.WriteLine(a); // output: 1234
int[] ints = [10, 20, 30];
IEnumerable<int> numbers = ints;
IList<int> list = (IList<int>)numbers;
Console.WriteLine(list.Count); // output: 3
Console.WriteLine(list[1]); // output: 20
Zie de sectie Expliciete conversies van de C#-taalspecificatie voor informatie over ondersteunde expliciete conversies. Zie Door de gebruiker gedefinieerde conversies voor meer informatie over het definiëren van een aangepaste expliciete of impliciete typeconversie.
Andere gebruiksrechten van ()
U gebruikt ook haakjes om een methode aan te roepen of een gemachtigde aan te roepen.
Een ander gebruik van haakjes is het aanpassen van de volgorde waarin C# bewerkingen in een expressie evalueert. Zie C#-operators voor meer informatie.
De operator typeof
De typeof operator haalt het System.Type exemplaar voor een type op. Het argument voor de typeof operator moet de naam van een type of een typeparameter zijn, zoals in het volgende voorbeeld wordt weergegeven:
void PrintType<T>() => Console.WriteLine(typeof(T));
Console.WriteLine(typeof(List<string>));
PrintType<int>();
PrintType<System.Int32>();
PrintType<Dictionary<int, char>>();
// Output:
// System.Collections.Generic.List`1[System.String]
// System.Int32
// System.Int32
// System.Collections.Generic.Dictionary`2[System.Int32,System.Char]
Het argument kan geen type zijn waarvoor metagegevensaantekeningen zijn vereist. Voorbeelden van deze typen zijn de volgende typen:
dynamic-
string?(of een null-verwijzingstype)
Deze typen worden niet rechtstreeks weergegeven in metagegevens. De typen bevatten kenmerken die het onderliggende type beschrijven. In beide gevallen kunt u het onderliggende type gebruiken. Gebruik dynamic in plaats van object. Gebruik string? in plaats van string.
U kunt de typeof operator ook gebruiken met niet-afhankelijke algemene typen. De naam van een niet-afhankelijk algemeen type moet het juiste aantal komma's bevatten, dat één kleiner is dan het aantal typeparameters. In het volgende voorbeeld ziet u het gebruik van de typeof operator met een niet-afhankelijk algemeen type:
Console.WriteLine(typeof(Dictionary<,>));
// Output:
// System.Collections.Generic.Dictionary`2[TKey,TValue]
Een expressie kan geen argument van de typeof operator zijn. Gebruik de System.Type methode om het Object.GetType exemplaar op te halen voor het uitvoeringstype van een expressieresultaat.
Typetests met de typeof operator
Gebruik de typeof operator om te controleren of het uitvoeringstype van het expressieresultaat exact overeenkomt met een bepaald type. In het volgende voorbeeld ziet u het verschil tussen typecontrole met behulp van de typeof operator en de is operator:
public class Animal { }
public class Giraffe : Animal { }
public static class TypeOfExample
{
public static void Main()
{
object b = new Giraffe();
Console.WriteLine(b is Animal); // output: True
Console.WriteLine(b.GetType() == typeof(Animal)); // output: False
Console.WriteLine(b is Giraffe); // output: True
Console.WriteLine(b.GetType() == typeof(Giraffe)); // output: True
}
}
Overbelasting van operatoren
U kunt de is, asen typeof operators niet overbelasten.
Een door de gebruiker gedefinieerd type kan de () operator niet overbelasten, maar kan aangepaste typeconversies definiëren die door een cast-expressie worden uitgevoerd. Zie Door de gebruiker gedefinieerde conversieoperators voor meer informatie.
C#-taalspecificatie
Zie de volgende secties van de C#-taalspecificatie voor meer informatie: