Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 Decimal
naar Char
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 naar Boolean
, wordt teruggebracht naar True
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 , , Short , UShort Integer , , UInteger , Long , , ULong Decimal Single Double |
Kort |
Short , , Integer Long , Decimal , , , Single Double |
UShort- |
UShort , , Integer UInteger , Long , , ULong , , Decimal Single Double |
geheel getal |
Integer , Long Decimal , Single , Double 2 |
UInteger- |
UInteger , , Long ULong , Decimal , , , Single Double |
Lang |
Long , , Decimal Single , Double 2 |
ULong- |
ULong , , Decimal Single , Double 2 |
decimale |
Decimal
Single , Double 2 |
enkele |
Single , Double |
Dubbel | Double |
Elk geïnventariseerd type (Enum) | Het onderliggende integrale type en elk type waarnaar het onderliggende type zich uitbreidt. |
Koolstof |
Char , String |
Char array |
Char array String |
Alle soorten | Object |
Elk afgeleid type | Elk basistype waaruit het is afgeleid 3. |
Alle soorten | 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
naar Single
of Double
kunnen leiden tot verlies van precisie, maar nooit in verlies van omvang. 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 Option Strict-instructie de typecontroleoptie instelt op On
of op Off
.
Conversies beperken
De standaardvernauwingsconversies omvatten de volgende:
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. De compiler staat niet toe dat u impliciet beperkte conversies uitvoert, tenzij de Option Strict-instructie de typecontroleoptie instelt op Off
.
Opmerking
De nauwkeurigheidsverliesfout wordt onderdrukt voor conversies van de elementen in een For Each…Next
verzameling naar de lusbesturingsvariabele. Zie de sectie 'Narrowing Conversions' in For Each...Next Statement voor meer informatie en voorbeelden.
Wanneer moet u de 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 een String
hebt dat 'Waar' of 'Onwaar' bevat, kunt u met het CBool
-trefwoord omzetten naar Boolean
.
Uitzonderingen tijdens conversie
Omdat het verbreden van conversies altijd slaagt, treden er geen uitzonderingen op. 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