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 az integrál típusból Decimalaz , vagy a Char helyről a másikra Stringkonvertá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 Integer, Long, Decimal, SingleDouble2
UInteger UInteger, Long, ULong, DecimalDoubleSingle2
Hosszú Long, Decimal, SingleDouble2
ULong ULong, Decimal, SingleDouble2
Decimális Decimal, Single, Double2
Egyetlen Single, Double
Dupla Double
Tetszőleges számbavételi típus (Enum) Mögöttes integráltípusa és bármely olyan típus, amelyre az alapul szolgáló típus szélesedik.
Char 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 , UInteger, , ULongLongvagy Decimal a SingleDouble -ból Integervaló átalakítások pontosságvesztést eredményezhetnek, de soha nem veszítik el a pontosságot. 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 konvertálások bővítése mindig sikeres futásidőben, és soha nem jár adatvesztéssel. Ezeket mindig implicit módon hajthatja végre, függetlenül attól, hogy az Option Strict Utasítás a típus-ellenőrző kapcsolót a következőre OnOffállítja be.

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 fordított irányai (kivéve, hogy minden típus önmagára szélesít)

  • Konvertálások bármelyik irányban logikai és 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 sztring és bármely numerikus típus közötti irányban, Booleanvagy dátum

  • 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ő konverziók implicit végrehajtását, hacsak az Option Strict Utasítás nem állítja be a típus-ellenőrző kapcsolót Off.

Feljegyzés

A szűkítés-konverziós hiba el lesz tiltva a gyűjtemény elemeiből For Each…Next a ciklusvezérlő változóba való konvertáláskor. További információkért és példákért tekintse meg a "Konvertálások szűkítése" szakaszt az Egyes... Következő utasítás.

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 "True" vagy "False" (Igaz) vagy "False" (Hamis) értéket tartalmaz, a CBool kulcsszóval átalakíthatja azt Boolean.

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 konvertálások szűkítése, ha sikertelenek, leggyakrabban a következő kivételeket alkalmazzá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. CType Emellett a Visual Basic függvényeket vagy .NET-keretrendszer metódusokat 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