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 False
a 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 , Long Decimal , Single Double |
Bájt |
Byte , Short , UShort , Integer , UInteger Long , ULong , Decimal , , Single Double |
Rövid |
Short , Integer , Long , Decimal Single Double |
UShort |
UShort , Integer , UInteger , Long ULong , Decimal , Single Double |
egész szám |
Integer , Long , Decimal , Single Double 2 |
UInteger |
UInteger , Long , ULong , Decimal Single Double 2 |
Hosszú |
Long , Decimal , Single Double 2 |
ULong |
ULong , Decimal , Single Double 2 |
decimális |
Decimal , Single , Double 2 |
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
Boolean
kö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