Inbyggda numeriska konverteringar (C#-referens)
C# innehåller en uppsättning numeriska typer av integraler och flyttalser . Det finns en konvertering mellan två numeriska typer, antingen implicita eller explicita. Du måste använda ett cast-uttryck för att utföra en explicit konvertering.
Implicita numeriska konverteringar
I följande tabell visas de fördefinierade implicita konverteringarna mellan de inbyggda numeriska typerna:
Från | Till |
---|---|
sbyte | short , int , long , float , double , decimal , eller nint |
byte | short , ushort , int , uint , long , ulong , float , double , decimal , , nint eller nuint |
Kort | int , long , float , double , eller decimal , eller nint |
ushort | int , uint , long , ulong , float , double , eller decimal , nint eller nuint |
Int | long , float , double , eller decimal , nint |
Uint | long , ulong , float , double , eller decimal , eller nuint |
Lång | float , double eller decimal |
ulong | float , double eller decimal |
Flyta | double |
nint | long , float , double , eller decimal |
nuint | ulong , float , double , eller decimal |
Kommentar
Implicita konverteringar från int
, uint
, long
, ulong
nint
eller nuint
till float
och från long
, ulong
, nint
eller nuint
till double
kan orsaka en förlust av precision, men aldrig en förlust av storleksordning. De andra implicita numeriska konverteringarna förlorar aldrig någon information.
Observera också att
Alla numeriska typer av integraler kan implicit konverteras till valfri numerisk flyttalstyp.
Det finns inga implicita konverteringar till typerna
byte
ochsbyte
. Det finns inga implicita konverteringar från typernadouble
ochdecimal
.Det finns inga implicita konverteringar mellan
decimal
typen och typernafloat
ellerdouble
.Ett värde för ett konstant uttryck av typen
int
(till exempel ett värde som representeras av en heltalsliteral) kan implicit konverteras tillsbyte
,byte
,short
,ushort
,uint
,ulong
,nint
ellernuint
, om det ligger inom måltypens intervall:byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
Som föregående exempel visar uppstår ett kompilatorfel CS0031 om konstantvärdet inte ligger inom måltypens intervall.
Explicita numeriska konverteringar
I följande tabell visas de fördefinierade explicita konverteringarna mellan de inbyggda numeriska typerna som det inte finns någon implicit konvertering för:
Från | Till |
---|---|
sbyte | byte , ushort , uint , ulong , eller nuint |
byte | sbyte |
Kort | sbyte , byte , ushort , uint , ulong , eller nuint |
ushort | sbyte , byte eller short |
Int | sbyte , byte , short , ushort , uint , ulong , eller nuint |
Uint | sbyte , byte , short , ushort , int , eller nint |
Lång | sbyte , byte , short , ushort , int , uint , ulong , nint eller nuint |
ulong | sbyte , byte , short , ushort , int , uint , long , nint eller nuint |
Flyta | sbyte , byte , short , ushort , int , uint , long , ulong , decimal , , nint eller nuint |
Dubbel | sbyte , byte , short , ushort , int , uint , long , ulong , float , , decimal , nint eller nuint |
decimal | sbyte , byte , short , ushort , int , uint , long , ulong , float , , double , nint eller nuint |
nint | sbyte , byte , short , ushort , int , uint , , ulong eller nuint |
nuint | sbyte , byte , short , ushort , int , uint , , long eller nint |
Kommentar
En explicit numerisk konvertering kan resultera i dataförlust eller utlösa ett undantag, vanligtvis en OverflowException.
Observera också att:
När du konverterar ett värde av en integrerad typ till en annan integraltyp beror resultatet på överflödeskontrollkontexten. I en markerad kontext lyckas konverteringen om källvärdet ligger inom måltypens intervall. Annars kastas en OverflowException . I en omarkerad kontext lyckas konverteringen alltid och fortsätter på följande sätt:
Om källtypen är större än måltypen trunkeras källvärdet genom att dess "extra" viktigaste bitar ignoreras. Resultatet behandlas sedan som ett värde av måltypen.
Om källtypen är mindre än måltypen är källvärdet antingen sign-extended eller zero-extended så att det har samma storlek som måltypen. Sign-extension används om källtypen är signerad. zero-extension används om källtypen är osignerad. Resultatet behandlas sedan som ett värde av måltypen.
Om källtypen har samma storlek som måltypen behandlas källvärdet som ett värde av måltypen.
När du konverterar ett
decimal
värde till en integraltyp avrundas det här värdet mot noll till närmaste integralvärde. Om det resulterande integralvärdet ligger utanför måltypens intervall genereras ett OverflowException värde.När du konverterar ett
double
värde ellerfloat
ett värde till en integraltyp avrundas det här värdet mot noll till närmaste integralvärde. Om det resulterande integralvärdet ligger utanför måltypens intervall beror resultatet på överflödeskontrollkontexten. I en markerad kontext genereras en OverflowException , medan resultatet i en omarkerad kontext är ett ospecificerat värde för måltypen.När du konverterar
double
tillfloat
double
avrundas värdet till närmastefloat
värde. Om värdetdouble
är för litet eller för stort för att passa in ifloat
typen blir resultatet noll eller oändligt.När du konverterar
float
ellerdouble
tilldecimal
konverteras källvärdet tilldecimal
representation och avrundas till närmaste tal efter den 28:e decimalplatsen om det behövs. Beroende på värdet för källvärdet kan något av följande resultat inträffa:Om källvärdet är för litet för att representeras som en
decimal
blir resultatet noll.Om källvärdet är NaN (inte ett tal), genereras oändligheten eller för stor för att representeras som en
decimal
.OverflowException
När du konverterar
decimal
tillfloat
ellerdouble
avrundas källvärdet till närmastefloat
värdedouble
.
Språkspecifikation för C#
Mer information finns i följande avsnitt i C#-språkspecifikationen: