Beépített numerikus konverziók (C#-referencia)

A C# integrál és lebegőpontos numerikus típusokat biztosít. Bármely két numerikus típus között létezik átalakítás, akár implicit, akár explicit. Explicit átalakításhoz cast kifejezést kell használnia.

Implicit numerikus konverziók

Az alábbi táblázat a beépített numerikus típusok közötti előre definiált implicit konverziókat mutatja be:

Forrás Művelet
sbyte short, int, long, floatdouble, , decimalvagynint
bájt short, ushort, int, uint, long, ulongfloat, double, decimal, , , nintvagynuint
Rövid int, long, float, doublevagy decimal, vagy nint
ushort int, uint, long, ulong, floatdouble, vagy decimal, nintvagynuint
Int long, float, doublevagy decimal, nint
uint long, ulong, float, doublevagy decimal, vagy nuint
Hosszú float, double vagy decimal
ulong float, double vagy decimal
Úszó double
nint long, float, doublevagy decimal
nuint ulong, float, doublevagy decimal

Feljegyzés

Az implicit konverziók a int, uint, , ulonglong, nint, nuintfloatlongvagy a , nintulongvagy a , , vagy nuint hogy double okozhat veszteség a pontosság, de soha nem veszteség egy nagyságrenddel. A többi implicit numerikus konverzió soha nem veszt el semmilyen információt.

Azt is vegye figyelembe, hogy

  • Minden integrál numerikus típus implicit módon bármely lebegőpontos numerikus típussá konvertálható.

  • Nincsenek implicit átalakítások a típusokra és sbyte a byte típusokra. Nincsenek implicit konverziók a típusokból és decimal típusokbóldouble.

  • A típus és floatdouble a decimal típus között nincsenek implicit konverziók.

  • A típus int állandó kifejezésének értéke (például egy egész szám konstans által képviselt érték) implicit módon konvertálható sbyte, , byte, short, ushortuint, ulong, vagy nintnuint, ha a céltípus tartományán belül van:

    byte a = 13;
    byte b = 300;  // CS0031: Constant value '300' cannot be converted to a 'byte'
    

    Ahogy az előző példa is mutatja, ha az állandó érték nem a céltípus tartományán belül van, cs0031-es fordítóhiba lép fel.

Explicit numerikus konverziók

Az alábbi táblázat az előre definiált explicit konverziókat mutatja be azon beépített numerikus típusok között, amelyeknél nincs implicit konverzió:

Forrás Művelet
sbyte byte, ushort, uint, ulongvagy nuint
bájt sbyte
Rövid sbyte, byte, ushort, uint, ulongvagy nuint
ushort sbyte, byte vagy short
Int sbyte, byte, short, ushortuint, , ulongvagynuint
uint sbyte, byte, short, ushort, intvagy nint
Hosszú sbyte, byte, short, ushort, intuint, ulong, , nintvagynuint
ulong sbyte, byte, short, ushort, intuint, long, , nintvagynuint
Úszó sbyte, byte, short, ushort, int, uintlong, ulong, decimal, , , nintvagynuint
Dupla sbyte, byte, short, ushort, int, uintlong, ulong, float, , decimal, nint, vagynuint
tizedes sbyte, byte, short, ushort, int, uintlong, ulong, float, , double, nint, vagynuint
nint sbyte, byte, short, ushort, intuint, , ulongvagynuint
nuint sbyte, byte, short, ushort, intuint, , longvagynint

Feljegyzés

A explicit numerikus átalakítás adatvesztést okozhat, vagy kivételt okozhat, általában egy OverflowException.

Vegye figyelembe azt is, hogy:

  • Ha egy integráltípus értékét egy másik integráltípusra konvertálja, az eredmény a túlcsordulás-ellenőrzési környezettől függ. Egy ellenőrzött környezetben az átalakítás akkor sikeres, ha a forrásérték a céltípus tartományán belül van. Ellenkező esetben egy OverflowException dobás történik. A nem ellenőrzött környezetben az átalakítás mindig sikeres lesz, és a következőképpen halad:

    • Ha a forrástípus nagyobb a céltípusnál, akkor a forrásértéket csonkolja a rendszer az "extra" legfontosabb bitek elvetésével. Az eredmény ezután a céltípus értékeként lesz kezelve.

    • Ha a forrástípus kisebb a céltípusnál, akkor a forrásérték vagy előjeles vagy nullával bővített, így a céltípuséval azonos méretű lesz. A forrástípus aláírása esetén a rendszer jelkiterjesztést használ; nulla kiterjesztést használ, ha a forrástípus nincs aláírva. Az eredmény ezután a céltípus értékeként lesz kezelve.

    • Ha a forrástípus mérete megegyezik a céltípus méretével, akkor a forrásérték a céltípus értékeként lesz kezelve.

  • Ha egy decimal értéket integráltípussá alakít át, a függvény ezt az értéket nullára kerekítve a legközelebbi integrál értékre kerekítve. Ha az eredményként kapott integrálérték kívül esik a céltípus tartományán, a függvény egy OverflowException értéket ad ki.

  • Ha egy double vagy float több értéket integráltípussá alakít át, a függvény ezt az értéket nullára kerekítve a legközelebbi integrál értékre kerekítve. Ha az eredményként kapott integrálérték kívül esik a céltípus tartományán, az eredmény a túlcsordulás-ellenőrzési környezettől függ. Egy ellenőrzött környezetben a rendszer eldob egy OverflowException értéket, míg egy nem ellenőrzött környezetben az eredmény a céltípus meghatározatlan értéke.

  • A konvertáláskor doublefloataz double érték a legközelebbi float értékre lesz kerekítve. Ha az double érték túl kicsi vagy túl nagy ahhoz, hogy beleférjen a float típusba, az eredmény nulla vagy végtelen.

  • Átalakításkor float vagy double átalakításkor decimala forrásérték ábrázolássá decimal alakul, és szükség esetén a legközelebbi számra kerekítve lesz a 28. tizedesjegy után. A forrásérték értékétől függően az alábbi eredmények egyike fordulhat elő:

    • Ha a forrásérték túl kicsi ahhoz, hogy egyként decimallegyen ábrázolva, az eredmény nullává válik.

    • Ha a forrásérték NaN (nem szám), végtelen vagy túl nagy ahhoz, hogy egyként decimallegyen ábrázolva, akkor a rendszer egy OverflowException értéket ad vissza.

  • Az átalakításkor decimalfloatdoublea forrásérték a legközelebbire float vagy double az értékre lesz kerekítve.

C# nyelvspecifikáció

További információt a C# nyelvspecifikációjának alábbi szakaszaiban talál:

Lásd még