Delen via


Ingebouwde numerieke conversies (C#-verwijzing)

C# biedt een set integrale en drijvende komma numerieke typen. Er bestaat een conversie tussen twee numerieke typen, impliciet of expliciet. U moet een cast-expressie gebruiken om een expliciete conversie uit te voeren.

Impliciete numerieke conversies

In de volgende tabel ziet u de vooraf gedefinieerde impliciete conversies tussen de ingebouwde numerieke typen:

Van Tot
sbyte short, , intlong, , float, , of decimaldoublenint
Byte short, , ushortint, uint, , long, , ulong, doublefloat, decimal, , nintofnuint
Korte int, , longfloat, , doubleof , of decimalnint
ushort int, , longuint, ulong, , float, , doubleof nintdecimalnuint
int long, , floatdoubleof decimal,nint
Uint long, , ulongfloat, , doubleof , of decimalnuint
Lange float, double of decimal
ulong float, double of decimal
Float double
nint long, , floatof doubledecimal
nuint ulong, , floatof doubledecimal

Notitie

De impliciete conversies van, , , , ulong, nintof van longfloatnintulong, nuint , of nuint om double een verlies van precisie te veroorzaken, maar nooit verlies van een orde van grootte. longuintint De andere impliciete numerieke conversies verliezen nooit informatie.

Houd er ook rekening mee dat

  • Elk integraal numeriek type wordt impliciet converteerbaar naar elk numeriek type met drijvende komma.

  • Er zijn geen impliciete conversies naar de byte en sbyte typen. Er zijn geen impliciete conversies van de double en decimal typen.

  • Er zijn geen impliciete conversies tussen het decimal type en de float typen double .

  • Een waarde van een constante expressie van het type int (bijvoorbeeld een waarde die wordt vertegenwoordigd door een letterlijk geheel getal) kan impliciet worden geconverteerd naar sbyte, byte, ushortshortuint, ulongof nintnuint, als deze zich binnen het bereik van het doeltype bevindt:

    byte a = 13;
    byte b = 300;  // CS0031: Constant value '300' cannot be converted to a 'byte'
    

    Zoals in het voorgaande voorbeeld wordt weergegeven, treedt er een compilerfout CS0031 op als de constante waarde zich niet binnen het bereik van het doeltype bevindt.

Expliciete numerieke conversies

In de volgende tabel ziet u de vooraf gedefinieerde expliciete conversies tussen de ingebouwde numerieke typen waarvoor er geen impliciete conversie is:

Van Tot
sbyte byte, , ushortuint, , of ulongnuint
Byte sbyte
Korte sbyte, , byteushort, , uint, of ulongnuint
ushort sbyte, byte of short
int sbyte, , byteshort, , ushort, , of ulonguintnuint
Uint sbyte, , byteshort, , ushort, of intnint
Lange sbyte, byte, short, ushort, int, uint, ulong, nint of nuint
ulong sbyte, byte, short, ushort, int, uint, long, nint of nuint
Float sbyte, , byteshort, ushort, , int, , uint, ulonglong, decimal, , nintofnuint
Dubbele sbyte, , short, , , uintint, long, ulongfloatdecimalnintushortbytenuint
Decimaal sbyte, , short, , , uintint, long, ulongfloatdoublenintushortbytenuint
nint sbyte, , byteshort, , ushort, int, , , uint, of ulongnuint
nuint sbyte, , byteshort, , ushort, int, , , uint, of longnint

Notitie

Een expliciete numerieke conversie kan leiden tot gegevensverlies of een uitzondering genereren, meestal een OverflowException.

Houd er ook rekening mee dat:

  • Wanneer u een waarde van een integraal type converteert naar een ander integraal type, is het resultaat afhankelijk van de context van overloopcontrole. In een gecontroleerde context slaagt de conversie als de bronwaarde binnen het bereik van het doeltype valt. Anders wordt er een OverflowException gegooid. In een niet-gecontroleerd context slaagt de conversie altijd en gaat het als volgt:

    • Als het brontype groter is dan het doeltype, wordt de bronwaarde afgekapt door de 'extra' belangrijkste bits te verwijderen. Het resultaat wordt vervolgens behandeld als een waarde van het doeltype.

    • Als het brontype kleiner is dan het doeltype, wordt de bronwaarde uitgebreid of nul uitgebreid, zodat deze van dezelfde grootte is als het doeltype. De tekenextensie wordt gebruikt als het brontype is ondertekend; zero-extension wordt gebruikt als het brontype niet is ondertekend. Het resultaat wordt vervolgens behandeld als een waarde van het doeltype.

    • Als het brontype dezelfde grootte heeft als het doeltype, wordt de bronwaarde beschouwd als een waarde van het doeltype.

  • Wanneer u een decimal waarde converteert naar een integraal type, wordt deze waarde afgerond op nul naar de dichtstbijzijnde integrale waarde. Als de resulterende integrale waarde buiten het bereik van het doeltype valt, wordt er een OverflowException gegenereerd.

  • Wanneer u een double of float waarde converteert naar een integraal type, wordt deze waarde afgerond op nul naar de dichtstbijzijnde integrale waarde. Als de resulterende integrale waarde buiten het bereik van het doeltype valt, is het resultaat afhankelijk van de context voor overloopcontrole. In een gecontroleerde context wordt er een OverflowException gegenereerd, terwijl het resultaat in een niet-gecontroleerde context een niet-opgegeven waarde van het doeltype is.

  • Wanneer u converteert double naar float, wordt de double waarde afgerond op de dichtstbijzijnde float waarde. Als de double waarde te klein of te groot is om in het float type te passen, is het resultaat nul of oneindig.

  • Wanneer u converteert float of double naar decimal, wordt de bronwaarde indien nodig geconverteerd naar decimal weergave en afgerond op het dichtstbijzijnde getal na de 28e decimale plaats. Afhankelijk van de waarde van de bronwaarde kan een van de volgende resultaten optreden:

    • Als de bronwaarde te klein is om te worden weergegeven als een decimal, wordt het resultaat nul.

    • Als de bronwaarde NaN (geen getal), oneindigheid of te groot is om te worden weergegeven als een decimal, wordt er een OverflowException gegenereerd.

  • Wanneer u converteert decimal naar float of double, wordt de bronwaarde afgerond op respectievelijk de dichtstbijzijnde float waarde of double waarde.

C#-taalspecificatie

Zie de volgende secties van de C#-taalspecificatie voor meer informatie:

Zie ook