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 , , int long , , float , , of decimal double nint |
Byte | short , , ushort int , uint , , long , , ulong , double float , decimal , , nint ofnuint |
Korte | int , , long float , , double of , of decimal nint |
ushort | int , , long uint , ulong , , float , , double of nint decimal nuint |
int | long , , float double of decimal ,nint |
Uint | long , , ulong float , , double of , of decimal nuint |
Lange | float , double of decimal |
ulong | float , double of decimal |
Float | double |
nint | long , , float of double decimal |
nuint | ulong , , float of double decimal |
Notitie
De impliciete conversies van, , , , ulong
, nint
of van long
float
nint
ulong
, nuint
, of nuint
om double
een verlies van precisie te veroorzaken, maar nooit verlies van een orde van grootte. long
uint
int
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
ensbyte
typen. Er zijn geen impliciete conversies van dedouble
endecimal
typen.Er zijn geen impliciete conversies tussen het
decimal
type en defloat
typendouble
.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 naarsbyte
,byte
,ushort
short
uint
,ulong
ofnint
nuint
, 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 , , ushort uint , , of ulong nuint |
Byte | sbyte |
Korte | sbyte , , byte ushort , , uint , of ulong nuint |
ushort | sbyte , byte of short |
int | sbyte , , byte short , , ushort , , of ulong uint nuint |
Uint | sbyte , , byte short , , ushort , of int nint |
Lange | sbyte , byte , short , ushort , int , uint , ulong , nint of nuint |
ulong | sbyte , byte , short , ushort , int , uint , long , nint of nuint |
Float | sbyte , , byte short , ushort , , int , , uint , ulong long , decimal , , nint ofnuint |
Dubbele | sbyte , , short , , , uint int , long , ulong float decimal nint ushort byte nuint |
Decimaal | sbyte , , short , , , uint int , long , ulong float double nint ushort byte nuint |
nint | sbyte , , byte short , , ushort , int , , , uint , of ulong nuint |
nuint | sbyte , , byte short , , ushort , int , , , uint , of long nint |
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
offloat
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
naarfloat
, wordt dedouble
waarde afgerond op de dichtstbijzijndefloat
waarde. Als dedouble
waarde te klein of te groot is om in hetfloat
type te passen, is het resultaat nul of oneindig.Wanneer u converteert
float
ofdouble
naardecimal
, wordt de bronwaarde indien nodig geconverteerd naardecimal
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
naarfloat
ofdouble
, wordt de bronwaarde afgerond op respectievelijk de dichtstbijzijndefloat
waarde ofdouble
waarde.
C#-taalspecificatie
Zie de volgende secties van de C#-taalspecificatie voor meer informatie: