Widening and Narrowing Conversions (Visual Basic)
Een belangrijke overweging bij een typeconversie is of het resultaat van de conversie binnen het bereik van het doelgegevenstype valt.
Bij een widening-conversie wordt een waarde gewijzigd in een gegevenstype dat elke mogelijke waarde van de oorspronkelijke gegevens mogelijk maakt. Bij het uitbreiden van conversies blijft de bronwaarde behouden, maar kan de weergave worden gewijzigd. Dit gebeurt als u converteert van een integraal type naar , of van Char
naar Decimal
String
.
Een vermalende conversie wijzigt een waarde in een gegevenstype dat mogelijk geen enkele van de mogelijke waarden kan bevatten. Een breukwaarde wordt bijvoorbeeld afgerond wanneer deze wordt geconverteerd naar een integraal type en een numeriek type dat wordt geconverteerd Boolean
naar True
een of False
.
Conversies breder maken
In de volgende tabel ziet u de standaard widening conversies.
Gegevenstype | Breder naar gegevenstypen 1 |
---|---|
SByte | SByte , , Short Integer , Long , , Decimal , , Single Double |
Byte | Byte , , UShort , Integer Short , , UInteger , Long , , Single Decimal ULong Double |
Korte | Short , , Integer Long , Decimal , , , Single Double |
UShort | UShort , , Integer UInteger , Long , , ULong , , Decimal Single Double |
Geheel getal | Integer , , Decimal , , Single , Double 2 Long |
UInteger | UInteger , , Long ULong , Decimal , , , Single Double 2 |
Lange | Long , , Decimal Single , Double 2 |
ULong | ULong , , Decimal Single , Double 2 |
Decimaal | Decimal Double , Single 2 |
Één | Single , Double |
Dubbel | Double |
Elk geïnventariseerd type (Enum) | Het onderliggende integrale type en elk type waarvan het onderliggende type breder wordt. |
Char | Char , String |
Char Array |
Char Array String |
Elk type | Object |
Elk afgeleid type | Elk basistype waaruit het is afgeleid 3. |
Elk type | Elke interface die wordt geïmplementeerd. |
Niets | Elk gegevenstype of objecttype. |
1 Per definitie wordt elk gegevenstype uitgebreid tot zichzelf.
2 Conversies van Integer
, UInteger
, , Long
, ULong
of Decimal
Single
Double
kunnen leiden tot verlies van precisie, maar nooit in verlies van grootte. In deze zin veroorzaken ze geen informatieverlies.
3 Het lijkt misschien verrassend dat een conversie van een afgeleid type naar een van de basistypen breder wordt. De reden hiervoor is dat het afgeleide type alle leden van het basistype bevat, zodat het in aanmerking komt als een instantie van het basistype. In de tegenovergestelde richting bevat het basistype geen nieuwe leden die zijn gedefinieerd door het afgeleide type.
Het breder maken van conversies slaagt altijd tijdens runtime en kan nooit gegevensverlies veroorzaken. U kunt ze altijd impliciet uitvoeren, ongeacht of de optie strikte instructie de typecontroleoptie On
instelt op of naar Off
.
Conversies beperken
De standaardvermalingsconversies zijn onder andere:
De omgekeerde richtingen van de verbreidingsconversies in de voorgaande tabel (behalve dat elk type wordt uitgebreid naar zichzelf)
Conversies in beide richtingen tussen Booleaanse waarde en elk numeriek type
Conversies van elk numeriek type naar een geïnventariseerd type (
Enum
)Conversies in beide richtingen tussen tekenreeks en elk numeriek type,
Boolean
of datumConversies van een gegevenstype of objecttype naar een type dat ermee is afgeleid
Het beperken van conversies lukt niet altijd tijdens runtime en kan gegevensverlies veroorzaken of mislukken. Er treedt een fout op als het doelgegevenstype de waarde die wordt geconverteerd, niet kan ontvangen. Een numerieke conversie kan bijvoorbeeld resulteren in een overloop. Met de compiler kunt u impliciet beperkte conversies uitvoeren, tenzij de Optie strikte instructie de typecontroleoptie Off
instelt op .
Notitie
De narrowing-conversiefout wordt onderdrukt voor conversies van de elementen in een For Each…Next
verzameling naar de lusbesturingselementvariabele. Zie de sectie 'Narrowing Conversions' in For Each voor meer informatie en voorbeelden. Volgende instructie.
Wanneer moet u narrowing-conversies gebruiken
U gebruikt een narrowing conversie wanneer u weet dat de bronwaarde kan worden geconverteerd naar het doelgegevenstype zonder fouten of gegevensverlies. Als u bijvoorbeeld weet String
dat het 'Waar' of 'Onwaar' bevat, kunt u het CBool
trefwoord gebruiken om het te converteren naar Boolean
.
Uitzonderingen tijdens conversie
Omdat het verbreeden van conversies altijd slaagt, worden er geen uitzonderingen gegooid. Het beperken van conversies, wanneer ze mislukken, genereert meestal de volgende uitzonderingen:
InvalidCastException — als er geen conversie is gedefinieerd tussen de twee typen
OverflowException — (alleen integrale typen) als de geconverteerde waarde te groot is voor het doeltype
Als een klasse of structuur een CType-functie definieert die moet fungeren als een conversieoperator naar of van die klasse of structuur, die elke uitzondering kan genereren die CType
het geschikt acht. Bovendien kan dat CType
Visual Basic-functies of .NET Framework-methoden aanroepen, die op zijn beurt verschillende uitzonderingen kunnen genereren.
Wijzigingen tijdens conversies van verwijzingstypen
Een conversie van een verwijzingstype kopieert alleen de aanwijzer naar de waarde. De waarde zelf wordt niet gekopieerd of gewijzigd. Het enige wat u kunt wijzigen, is het gegevenstype van de variabele met de aanwijzer. In het volgende voorbeeld wordt het gegevenstype geconverteerd van de afgeleide klasse naar de basisklasse, maar het object waarnaar beide variabelen nu verwijzen, is ongewijzigd.
' 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