Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
C# innehåller en uppsättning numeriska typer av integraler och flyttalser . Det finns en implicit eller explicit konvertering mellan två numeriska typer. Använd ett cast-uttryck för att utföra en explicit konvertering.
C#-språkreferensen dokumenterar den senaste versionen av C#-språket. Den innehåller även inledande dokumentation för funktioner i offentliga förhandsversioner för den kommande språkversionen.
Dokumentationen identifierar alla funktioner som först introducerades i de tre senaste versionerna av språket eller i aktuella offentliga förhandsversioner.
Tips/Råd
Information om när en funktion först introducerades i C# finns i artikeln om språkversionshistoriken för C#.
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, , ninteller nuint |
| kort |
int, long, float, double, decimal, eller nint |
int, uint, long, ulong, float, double, decimal, , ninteller nuint |
|
| int |
long, float, double, decimaleller nint |
| uint |
long, ulong, float, double, decimal, eller nuint |
| lång |
float, double eller decimal |
| ulong |
float, double eller decimal |
| sväva | double |
| nint |
long, float, doubleeller decimal |
| nuint |
ulong, float, doubleeller decimal |
Anmärkning
Implicita konverteringar från int, uint, long, ulongninteller nuint till float och från long, ulong, ninteller 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
byteochsbyte. Det finns inga implicita konverteringar från typernadoubleochdecimal.Det finns inga implicita konverteringar mellan
decimaltypen och typernafloatellerdouble.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,nintellernuintom det ligger inom måltypens intervall:byte a = 13; byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
Om konstantvärdet inte ligger inom måltypens intervall uppstår ett kompilatorfel CS0031 .
Explicita numeriska konverteringar
I följande tabell visas de fördefinierade explicita konverteringarna mellan de inbyggda numeriska typerna där det inte finns någon implicit konvertering:
| Från | Till |
|---|---|
| sbyte |
byte, ushort, uint, ulongeller nuint |
| byte | sbyte |
| kort |
sbyte, byte, ushort, uint, ulong, eller nuint |
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, , ninteller nuint |
| ulong |
sbyte, byte, short, ushort, int, uint, long, , ninteller nuint |
| sväva |
sbyte, byte, short, ushort, int, uint, long, ulong, decimal, , ninteller nuint |
| dubbel |
sbyte, byte, short, ushort, int, uint, long, ulong, float, , decimal, ninteller nuint |
| decimal |
sbyte, byte, short, ushort, int, uint, long, ulong, float, , double, ninteller nuint |
| nint |
sbyte, byte, short, ushort, int, uint, , ulongeller nuint |
| nuint |
sbyte, byte, short, ushort, int, uint, , longeller nint |
Anmärkning
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 utlöses 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, så utökas källvärdet antingen med tecken (teckenutvidgad) eller med nollor (nollutvidgad) 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
decimalvä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
doublevärde ellerfloatett 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
doubletillfloatdoubleavrundas värdet till närmastefloatvärde. Om värdetdoubleär för litet eller för stort för att passa in ifloattypen blir resultatet noll eller oändligt.När du konverterar
floatellerdoubletilldecimalkonverteras källvärdet tilldecimalrepresentation 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
decimalblir 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
- Om källvärdet är för litet för att representeras som en
När du konverterar
decimaltillfloatellerdoubleavrundas källvärdet till närmastefloatvärdedouble.
Språkspecifikation för C#
Mer information finns i följande avsnitt i C#-språkspecifikationen: