Megosztás a következőn keresztül:


Konvertálások szélesítése és szűkítése (Visual Basic)

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 Boolean közötti irányban

  • Adattí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  

Lásd még