Delen via


Typecasting en typeconversies (C# Programmeerhandleiding)

Omdat C# statisch is getypt tijdens het compileren, kan deze, nadat een variabele is gedeclareerd, niet opnieuw worden gedeclareerd of een waarde van een ander type toegewezen, tenzij dat type impliciet wordt omgezet in het type van de variabele. Bijvoorbeeld, de string kan niet impliciet worden geconverteerd naar int. Daarom kunt u nadat u i als een int declareert, de tekenreeks 'Hallo' er niet aan toewijzen, zoals in de volgende code wordt weergegeven:

int i;

// error CS0029: can't implicitly convert type 'string' to 'int'
i = "Hello";

Mogelijk moet u echter soms een waarde kopiëren naar een variabele of methodeparameter van een ander type. U kunt bijvoorbeeld een variabele voor een geheel getal hebben die u moet doorgeven aan een methode waarvan de parameter is getypt als double. Of mogelijk moet u een klassevariabele toewijzen aan een variabele van een interfacetype. Dit soort bewerkingen worden typeconversies genoemd. In C# kunt u de volgende soorten conversies uitvoeren:

  • Impliciete conversies: er is geen speciale syntaxis vereist omdat de conversie altijd slaagt en er geen gegevens verloren gaan. Voorbeelden hiervan zijn conversies van kleinere naar grotere integrale typen, conversies van afgeleide klassen naar basisklassen en spanconversies.

  • Expliciete conversies (casts): voor expliciete conversies is een cast-expressie vereist. Casting is vereist wanneer informatie verloren kan gaan bij de conversie, of wanneer de conversie om andere redenen niet slaagt. Typische voorbeelden zijn numerieke conversie naar een type met minder precisie of een kleiner bereik, en conversie van een exemplaar van basisklasse naar een afgeleide klasse.

  • Door de gebruiker gedefinieerde conversies: door de gebruiker gedefinieerde conversies gebruiken speciale methoden die u kunt definiëren om expliciete en impliciete conversies mogelijk te maken tussen aangepaste typen die geen basisklasserelatie hebben. Zie Door de gebruiker gedefinieerde conversieoperators voor meer informatie.

  • Conversies met helperklassen: Als u wilt converteren tussen niet-compatibele typen, zoals gehele getallen en System.DateTime objecten, of hexadecimale tekenreeksen en bytematrices, kunt u de System.BitConverter klasse, de System.Convert klasse en de Parse methoden van de ingebouwde numerieke typen gebruiken, zoals Int32.Parse. Zie de volgende artikelen voor meer informatie:

  • Een bytematrix converteren naar een int

  • Een tekenreeks converteren naar een getal

  • Converteren tussen hexadecimale tekenreeksen en numerieke typen

Impliciete conversies

Voor ingebouwde numerieke typen kan een impliciete conversie worden uitgevoerd wanneer de waarde die moet worden opgeslagen in de variabele past zonder afgekapt of afgerond te worden. Voor integrale typen betekent deze beperking dat het bereik van het brontype een juiste subset is van het bereik voor het doeltype. Een variabele van het type lang (64-bits geheel getal) kan bijvoorbeeld elke waarde opslaan die een int (32-bits geheel getal) kan opslaan. In het volgende voorbeeld converteert de compiler impliciet de waarde van num rechts naar een type long voordat deze wordt toegewezen aan bigNum.

// Implicit conversion. A long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;

Zie de sectie Impliciete numerieke conversies van het artikel ingebouwde numerieke conversies voor een volledige lijst met alle impliciete numerieke conversies.

Voor referentietypen bestaat een impliciete conversie altijd van een klasse naar een van de directe of indirecte basisklassen of interfaces. Er is geen speciale syntaxis nodig omdat een afgeleide klasse altijd alle leden van een basisklasse bevat.

Derived d = new Derived();

// Always OK.
Base b = d;

Expliciete conversies

Als een conversie echter niet kan worden uitgevoerd zonder verlies van informatie, vereist de compiler dat u een expliciete conversie uitvoert, die een cast wordt genoemd. Een cast is een manier om conversie expliciet uit te voeren. Het geeft aan dat u weet dat er gegevensverlies kan optreden, of dat de cast tijdens runtime kan mislukken. Als u een cast wilt uitvoeren, geeft u het doeltype tussen haakjes op vóór de uitdrukking die u wilt omzetten. Het volgende programma cast een double naar een int. Het programma wordt niet gecompileerd zonder de cast.

double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
Console.WriteLine(a);
// Output: 1234

Zie de sectie Expliciete numerieke conversies van het artikel Ingebouwde numerieke conversies voor een volledige lijst met ondersteunde expliciete numerieke conversies.

Voor referentietypen is een expliciete cast vereist als u wilt converteren van een basistype naar een afgeleid type:

Een cast-bewerking tussen referentietypen wijzigt niet het runtimetype van het onderliggende object; het wijzigt alleen het type van de waarde die wordt gebruikt als verwijzing naar dat object. Zie Polymorfisme voor meer informatie.

Typeconversie-uitzonderingen tijdens runtime

Bij sommige conversies van referentietypen kan de compiler niet bepalen of een cast geldig is. Het is mogelijk dat een cast-bewerking die correct wordt gecompileerd, tijdens de uitvoertijd kan falen. Zoals te zien is in het volgende voorbeeld, veroorzaakt een typecast die mislukt tijdens de uitvoering een InvalidCastException-uitzondering.

Animal a = new Mammal();
Reptile r = (Reptile)a; // InvalidCastException at run time

Het argument a expliciet naar een Reptile maken is een gevaarlijke aanname. Het is veiliger om geen aannames te doen, maar controleer het type. C# biedt de is operator waarmee u kunt testen op compatibiliteit voordat u daadwerkelijk een cast uitvoert. Voor meer informatie, zie Hoe veilig te casten met behulp van patroonherkenning en de operators 'as' en 'is'.

C#-taalspecificatie

Zie de sectie Conversies van de C#-taalspecificatie voor meer informatie.

Zie ook