Dela via


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, , ninteller nuint
kort int, long, float, double, eller decimal, eller nint
int, uint, long, ulong, float, double, eller decimal, ninteller 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
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 byte och sbyte . Det finns inga implicita konverteringar från typerna double och decimal .

  • Det finns inga implicita konverteringar mellan decimal typen och typerna float eller 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, 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 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 eller float 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 till floatdouble avrundas värdet till närmaste float värde. Om värdet double är för litet eller för stort för att passa in i float typen blir resultatet noll eller oändligt.

  • När du konverterar float eller double till decimalkonverteras källvärdet till decimal 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 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 decimal till float eller doubleavrundas källvärdet till närmaste float värde double .

Språkspecifikation för C#

Mer information finns i följande avsnitt i C#-språkspecifikationen:

Se även