Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
| Ettől kezdve | Há |
|---|---|
| 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 |
| előjelnélküli egész |
long, ulong, float, doublevagy decimal, vagy 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, , 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
sbyteabytetípusokra. Nincsenek implicit konverziók a típusokból ésdecimaltípusokbóldouble.A típus és
floatdoubleadecimaltí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, vagynintnuint, 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ó:
| Ettől kezdve | Há |
|---|---|
| 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í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
doublevagyfloattö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
doublefloatazdoubleérték a legközelebbifloatértékre lesz kerekítve. Ha azdoubleérték túl kicsi vagy túl nagy ahhoz, hogy beleférjen afloattípusba, az eredmény nulla vagy végtelen.Átalakításkor
floatvagydoubleátalakításkordecimala forrásérték ábrázolássádecimalalakul, é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özelebbirefloatvagydoubleaz értékre lesz kerekítve.
C# nyelvspecifikáció
További információt a C# nyelvspecifikációjának alábbi szakaszaiban talál: