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

A C# integrál és lebegőpontos numerikus típusokat biztosít. Implicit vagy explicit konverzió két numerikus típus között létezik. Explicit konverzió végrehajtása öntött kifejezés használatával.

A C# nyelv referenciadokumentuma a C# nyelv legújabb kiadású verzióját ismerteti. Emellett a közelgő nyelvi kiadás nyilvános előzetes verziójú funkcióinak kezdeti dokumentációját is tartalmazza.

A dokumentáció azonosítja azokat a funkciókat, amelyeket először a nyelv utolsó három verziójában vagy az aktuális nyilvános előzetes verziókban vezetnek be.

Jótanács

Ha meg szeretné tudni, hogy mikor jelent meg először egy funkció a C#-ban, tekintse meg a C# nyelvi verzióelőzményeiről szóló cikket.

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:

Ettől kezdve
sbyte short, int, long, floatdouble, , decimalvagynint
bájt short, ushort, int, uint, long, ulongfloat, double, decimal, , , nintvagynuint
rövid int, long, float, double, decimalvagy nint
ushort int, uint, long, ulong, floatdouble, decimal, , nintvagynuint
int long, float, double, decimalvagy nint
előjelnélküli egész long, ulong, float, double, decimalvagy nuint
hosszú float, double vagy decimal
ulong float, double vagy decimal
float double
nint long, float, doublevagy decimal
nuint ulong, float, doublevagy decimal

Megjegyzés:

Az implicit konverziók a int, uint, long, ulong, nint, vagy nuintfloatlongulongnintnuint a , vagy hogy double okozhatnak 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 byte a sbyte típusokra. Nincsenek implicit konverziók a típusokból és double típusokbóldecimal.

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

  • Egy állandó típusú int kifejezés értéke (például egy egész szám konstans által képviselt érték) implicit módon konvertálható sbyte, , byte, shortushort, uint, , ulong, nintnuint vagy 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'
    

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

Ettől kezdve
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
előjelnélküli egész sbyte, byte, short, ushort, intvagy nint
hosszú sbyte, byte, short, ushort, intuint, ulong, , nintvagynuint
ulong sbyte, byte, short, ushort, intuint, long, , nintvagynuint
float sbyte, byte, short, ushort, int, uintlong, ulong, decimal, , , nintvagynuint
dupla sbyte, byte, short, ushort, int, uintlong, ulong, float, , decimal, nint, vagynuint
decimális 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

Megjegyzé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 kivétel keletkezik. 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éket vagy előjellel kibővítik, vagy nullával kibővítik, hogy ezt a céltípus méretéhez igazítják. 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ít. 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ít. 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