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 típuskonverzió fontos szempontja, hogy az átalakítás eredménye a céladattípus tartományán belül van-e.
A szélesítő átalakítás olyan adattípusra módosítja az értéket, amely lehetővé teszi az eredeti adatok bármely lehetséges értékét. A konvertálások bővítése megőrzi a forrásértéket, de megváltoztathatja annak megjelenítését. Ez akkor fordul elő, ha integrált típusból Decimal-ra, vagy Char-ről String-re konvertál.
A szűkülő átalakítás olyan adattípusra módosítja az értéket, amely nem biztos, hogy képes tárolni a lehetséges értékek egy részét. A törtértékek például kerekítve lesznek, amikor az egész típussá alakul át, és a konvertálandó Boolean numerikus típusok egyikére True vagy Falsea másikra lesznek csökkentve.
Átalakítások szélesedése
Az alábbi táblázat a szabványos szélesítési konverziókat mutatja be.
| Adattípus | Szélesítés adattípusokra 1 |
|---|---|
| SByte |
SByte, Short, Integer, LongDecimal, SingleDouble |
| Bájt |
Byte, Short, UShort, Integer, UIntegerLong, ULong, Decimal, , SingleDouble |
| Rövid |
Short, Integer, Long, DecimalSingleDouble |
| UShort |
UShort, Integer, UInteger, LongULong, Decimal, SingleDouble |
| egész szám |
Integer, Long, Decimal, SingleDouble2 |
| UInteger |
UInteger, Long, ULong, DecimalSingleDouble 2 |
| Hosszú |
Long, Decimal, SingleDouble2 |
| ULong |
ULong, Decimal, SingleDouble2 |
| decimális |
Decimal, Single, Double2 |
| egyedülálló |
Single, Double |
| Dupla | Double |
| Tetszőleges számbavételi típus (Enum) | Alapjául szolgáló integráltípus és bármely típus, amelyre az alapvető típus kiszélesedik. |
| Karakter |
Char, String |
Char tömb |
Char tömb String |
| Bármilyen típus | Objektum |
| Bármilyen származtatott típus | Bármely alaptípus, amelyből származik 3. |
| Bármilyen típus | Bármilyen felület, amit implementál. |
| Semmi | Bármilyen adattípus vagy objektumtípus. |
1 Definíció szerint minden adattípus önmagára szélesedik.
2 A Integer, UInteger, Long, ULong vagy Decimal formátumokból Single vagy Double formátumra történő átalakítások pontosságvesztést eredményezhetnek, de soha nem eredményeznek nagyságbeli veszteséget. Ebben az értelemben nem okoznak adatvesztést.
3 Meglepőnek tűnhet, hogy a származtatott típusból az egyik alaptípusba való átalakítás szélesedik. Az indoklás az, hogy a származtatott típus az alaptípus összes tagját tartalmazza, ezért az alaptípus példányának minősül. Ellenkező irányban az alaptípus nem tartalmaz a származtatott típus által definiált új tagokat.
A szélesítő konverziók futásidőben mindig sikeresek, és soha nem járnak adatvesztéssel. Mindig végrehajthatja ezeket implicit módon, függetlenül attól, hogy az Option Strict Utasítás a típusellenőrző kapcsolót On vagy Off értékre állítja.
Konverziók szűkítése
A szabványos szűkítési átalakítások a következők:
Az előző táblázatban szereplő szélesítési konverziók ellentétes irányai (kivéve, hogy minden típus önmagát szélesíti)
Bármelyik irányú konvertálások a Boolean és bármely numerikus típus között
Konvertálás bármilyen numerikus típusból bármely számba sorolt típusra (
Enum)Átalakítások a karakterlánc és bármely numerikus típus vagy
Booleanközötti iránybanAdattípusból vagy objektumtípusból az abból származtatott típusra történő konvertálás
A konvertálások szűkítése nem mindig sikerül futásidőben, és meghiúsulhat vagy adatvesztést okozhat. Hiba történik, ha a céladattípus nem tudja fogadni a konvertált értéket. Egy numerikus átalakítás például túlcsordulást eredményezhet. A fordító nem teszi lehetővé a szűkítési konverziók implicit végrehajtását, hacsak az Option Strict Utasítás nem állítja be a típusellenőrzési kapcsolót Off.
Megjegyzés:
A gyűjtemény For Each…Next elemeiből a ciklusvezérlő változóba történő konvertáláskor a szűkítő konverziós hiba el van nyomva. További információkért és példákért tekintse meg a "Szűkítő konverziók" szakaszt az For Each...Next utasítás részben.
Mikor érdemes szűkítési konverziókat használni?
Szűkítő konverziót akkor használ, ha tudja, hogy a forrásérték hiba vagy adatvesztés nélkül konvertálható a cél adattípusra. Ha például olyan String van, amelyről tudja, hogy "Igaz" vagy "Hamis" értéket tartalmaz, a CBool kulcsszóval átalakíthatja Boolean-vé.
Kivételek az átalakítás során
Mivel a konvertálások bővítése mindig sikeres, nem kivételeket eredményeznek. A szűkítő konvertálások, ha sikertelenek, leggyakrabban a következő kivételeket dobják:
InvalidCastException — ha a két típus között nincs átalakítás meghatározva
OverflowException — (csak integráltípusok esetén), ha az átalakított érték túl nagy a céltípushoz
Ha egy osztály vagy struktúra olyan CType-függvényt határoz meg, amely átalakító operátorként szolgál az adott osztály vagy struktúra felé vagy onnan, amely CType bármilyen, megfelelőnek ítélt kivételt okozhat. Emellett CType a Visual Basic függvényeket vagy a .NET-keretrendszer metódusait is meghívhatja, amelyek azonban számos kivételt okozhatnak.
Változások referenciatípus-átalakítások során
Egy referenciatípusból való átalakítás csak a mutatót másolja az értékre. Maga az érték semmilyen módon nem másolható és nem módosítható. Az egyetlen dolog, ami módosítható, az a mutatót tartalmazó változó adattípusa. Az alábbi példában az adattípus a származtatott osztályból az alaposztályba lesz konvertálva, de az objektum, amelyre mindkét változó mutat, változatlan.
' Assume class cSquare inherits from class cShape.
Dim shape As cShape
Dim square As cSquare = New cSquare
' The following statement performs a widening
' conversion from a derived class to its base class.
shape = square