Delen via


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 DecimalString.

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, , ShortInteger, Long, , Decimal, , SingleDouble
Byte Byte, , UShort, IntegerShort, , UInteger, Long, , SingleDecimalULongDouble
Korte Short, , IntegerLong, Decimal, , , SingleDouble
UShort UShort, , IntegerUInteger, Long, , ULong, , DecimalSingleDouble
Geheel getal Integer, , Decimal, , Single, Double2 Long
UInteger UInteger, , LongULong, Decimal, , , SingleDouble2
Lange Long, , DecimalSingle, Double2
ULong ULong, , DecimalSingle, Double2
Decimaal DecimalDouble, Single2
Éé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, ULongof DecimalSingleDouble 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, Booleanof datum

  • Conversies 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 Offinstelt 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  

Zie ook