Share 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
ushort 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
Flyta double
nint long, float, double, eller decimal
nuint ulong, float, double, eller decimal

Kommentar

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, 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, , 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

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 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