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.
Mivel a C# statikusan van beírva a fordításkor, a változó deklarálása után nem deklarálható újra, és nem rendelhető hozzá egy másik típusú értékhez, kivéve, ha ez a típus implicit módon átalakítható a változó típusára. Például a string nem konvertálható implicit módon int. Miután i-t int-ként deklarálta, nem rendelheti hozzá a "Hello" szöveget, ahogy az alábbi kód is mutatja:
int i;
// error CS0029: can't implicitly convert type 'string' to 'int'
i = "Hello";
Előfordulhat azonban, hogy egy értéket másolnia kell egy másik típusú változóba vagy metódusparaméterbe. Előfordulhat például, hogy van egy egész szám változója, amelyet át kell adnia egy metódusnak, amelynek paramétere a következő.double Vagy előfordulhat, hogy osztályváltozót kell hozzárendelnie egy felülettípusú változóhoz. Ezeket a műveleteket típuskonverziónak nevezzük. A C#-ban a következő típusú átalakításokat hajthatja végre:
Implicit konverziók: Nincs szükség speciális szintaxisra, mert az átalakítás mindig sikeres, és nem vesznek el adatok. Ilyenek például a kisebb és nagyobb integrált típusok közötti átalakítások, a származtatott osztályokból alaposztályokké történő átalakítások, valamint a konverziók átfedése.
Explicit konverziók (öntöttek):: Az explicit konverziókhoz öntött kifejezésre van szükség. Az átalakításra akkor van szükség, ha az adatok elveszhetnek az átalakítás során, vagy ha az átalakítás más okból nem sikerül. Tipikus példák például a numerikus átalakítás kisebb pontosságú vagy kisebb tartományú típusra, valamint az alaposztálypéldányok származtatott osztályba való konvertálása.
Felhasználó által definiált konverziók: A felhasználó által definiált konverziók speciális metódusokat használnak, amelyekkel explicit és implicit konverziókat engedélyezhet olyan egyéni típusok között, amelyek nem rendelkeznek alaposztály-származtatott osztálykapcsolatokkal. További információ: Felhasználó által definiált konverziós operátorok.
Átalakítás segédosztályokkal: Nem kompatibilis típusok, például egész számok és System.DateTime objektumok, hexadecimális sztringek és bájttömbök közötti konvertáláshoz használhatja az System.BitConverter osztályt, az System.Convert osztályt és a
Parsebeépített numerikus típusok metódusait, például Int32.Parse. További információkért lásd a következő cikkeket:Hexadecimális sztringek és numerikus típusok közötti konvertálás
Implicit konverziók
A beépített numerikus típusok esetében implicit átalakítást lehet elvégezni, ha a tárolandó érték csonkítás vagy lekerekítés nélkül illeszkedik a változóba. Az integráltípusok esetében ez a korlátozás azt jelenti, hogy a forrástípus tartománya a céltípus tartományának megfelelő részhalmaza. Egy hosszú típusú változó (64 bites egész szám) például bármilyen értéket tárolhat, amelyet egy int (32 bites egész szám) tárolhat. Az alábbi példában a fordító implicit módon átalakítja a jobb oldali értéket num egy típussá long , mielőtt hozzá rendeli bigNum.
// Implicit conversion. A long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
A teljes implicit numerikus konverziók listáját a Beépített numerikus konverziók cikk Implicit numerikus konverziók szakaszában találja.
Referenciatípusok esetén az implicit átalakítás mindig létezik egy osztályból bármely közvetlen vagy közvetett alaposztályba vagy interfészbe. Nincs szükség speciális szintaxisra, mert egy származtatott osztály mindig tartalmazza az alaposztály összes tagját.
Derived d = new Derived();
// Always OK.
Base b = d;
Explicit konverziók
Ha azonban a konvertálás nem végezhető el az adatok elvesztésének kockázata nélkül, a fordítóprogramnak explicit átalakítást kell végrehajtania, amelyet kasztolásnak nevezünk. Az átalakítás explicit módon történő végrehajtására a kaszt egy módszer. Azt jelzi, hogy tisztában van azzal, hogy adatvesztés történhet, vagy a leadás futásidőben meghiúsulhat. A leadás végrehajtásához zárójelben adja meg a céltípust a konvertálni kívánt kifejezés előtt. Az alábbi program egy dupla elemet ad egy inthez. A program nem fordítja le a szereplők nélkül.
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
Console.WriteLine(a);
// Output: 1234
A támogatott explicit numerikus konverziók teljes listáját a beépített numerikus átalakítások cikk Explicit numerikus konverziókszakaszában találja.
Referenciatípusok esetén explicit kasztolásra van szükség, ha alaptípusból levezetett típusra kell konvertálnia.
A referenciatípusok közötti öntött művelet nem módosítja az alapul szolgáló objektum futásidejének típusát; csak az adott objektumra mutató hivatkozásként használt érték típusát módosítja. További információ: Polimorfizmus.
Típuskonvertálási kivételek futásidőben
Bizonyos referenciatípus-átalakítások esetén a fordító nem tudja megállapítani, hogy érvényes-e a konverzió. Futtatáskor előfordulhat, hogy a helyesen leforduló típuskonverziós művelet meghiúsul. Ahogy az a következő példában is látható, a futásidőben meghiúsuló típuskonverzió kivételt dob InvalidCastException.
Animal a = new Mammal();
Reptile r = (Reptile)a; // InvalidCastException at run time
Az argumentum a típusúra explicit kényszerítése veszélyes feltételezést tesz. Biztonságosabb, ha nem feltételezünk feltételezéseket, hanem inkább ellenőrizzük a típust. A C# biztosítja az is operátort, hogy teszteld a kompatibilitást, mielőtt ténylegesen type cast-ot végzel. További információkért lásd: Hogyan lehet biztonságosan átalakítani a mintaillesztéssel és az 'as' és 'is' operátorok használatával.
C# nyelvspecifikáció
További információ: A C# nyelv specifikációjánakKonverziók szakasza.