Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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, ellernint | 
| byte | short,ushort,int,uint,long,ulong,float,double,decimal, ,nintellernuint | 
| kort | int,long,float,double, ellerdecimal, ellernint | 
| int,uint,long,ulong,float,double, ellerdecimal,nintellernuint | |
| int | long,float,double, ellerdecimal,nint | 
| uint | long,ulong,float,double, ellerdecimal, ellernuint | 
| lång | float,doubleellerdecimal | 
| ulong | float,doubleellerdecimal | 
| sväva | double | 
| nint | long,float,doubleellerdecimal | 
| nuint | ulong,float,doubleellerdecimal | 
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 - byteoch- sbyte. Det finns inga implicita konverteringar från typerna- doubleoch- decimal.
- Det finns inga implicita konverteringar mellan - decimaltypen och typerna- floateller- double.
- Ett värde för ett konstant uttryck av typen - int(till exempel ett värde som representeras av en heltalsliteral) kan implicit konverteras till- sbyte,- byte,- short,- ushort,- uint,- ulong,- ninteller- nuint, 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,ulongellernuint | 
| byte | sbyte | 
| kort | sbyte,byte,ushort,uint,ulong, ellernuint | 
| sbyte,byteellershort | |
| int | sbyte,byte,short,ushort,uint,ulong, ellernuint | 
| uint | sbyte,byte,short,ushort,int, ellernint | 
| lång | sbyte,byte,short,ushort,int,uint,ulong, ,nintellernuint | 
| ulong | sbyte,byte,short,ushort,int,uint,long, ,nintellernuint | 
| sväva | sbyte,byte,short,ushort,int,uint,long,ulong,decimal, ,nintellernuint | 
| dubbel | sbyte,byte,short,ushort,int,uint,long,ulong,float, ,decimal,nintellernuint | 
| decimal | sbyte,byte,short,ushort,int,uint,long,ulong,float, ,double,nintellernuint | 
| nint | sbyte,byte,short,ushort,int,uint, ,ulongellernuint | 
| nuint | sbyte,byte,short,ushort,int,uint, ,longellernint | 
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 eller- floatett 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 - doubletill- float- doubleavrundas värdet till närmaste- floatvärde. Om värdet- doubleär för litet eller för stort för att passa in i- floattypen blir resultatet noll eller oändligt.
- När du konverterar - floateller- doubletill- decimalkonverteras källvärdet till- decimalrepresentation 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
 
- När du konverterar - decimaltill- floateller- doubleavrundas källvärdet till närmaste- floatvärde- double.
Språkspecifikation för C#
Mer information finns i följande avsnitt i C#-språkspecifikationen: