Freigeben über


Erweiternde und eingrenzende Konvertierungen (Visual Basic)

Ein wichtiger Aspekt bei einer Typkonvertierung ist, ob das Ergebnis der Konvertierung innerhalb des Bereichs des Zieldatentyps liegt.

Durch eine Erweiterung der Konvertierung wird ein Wert in einen Datentyp geändert, der einen beliebigen möglichen Wert der ursprünglichen Daten ermöglichen kann. ** Erweiterungskonvertierungen behalten den ursprünglichen Wert bei, können jedoch dessen Darstellung ändern. Dies tritt auf, wenn Sie von einem integralen Typ in Decimal oder von Char in String konvertieren.

Eine schmale Konvertierung ändert einen Wert in einen Datentyp, der möglicherweise einige der möglichen Werte nicht enthalten kann. Beispielsweise wird ein Bruchwert gerundet, wenn er in einen integralen Typ konvertiert wird, und ein numerischer Typ, der in Boolean konvertiert wird, auf entweder True oder False reduziert.

Erweiterungskonvertierungen

Die folgende Tabelle enthält die standardmäßigen erweiternden Konvertierungen.

Datentyp Erweitert auf Datentypen 1
SByte SByte, , ShortInteger, Long, Decimal, , SingleDouble
Byte- Byte, Short, , IntegerUShort, UInteger, Long, ULong, , , Decimal, , SingleDouble
Kurze Short, , IntegerLong, Decimal, , SingleDouble
UShort- UShort, , IntegerUInteger, Long, ULong, Decimal, , SingleDouble
Ganze Zahl Integer, Long, Decimal, Single, Double2
UInteger- UInteger, Long, ULong, Decimal, Single, Double2
Lang Long, , DecimalSingle, Double2
ULong- ULong, , DecimalSingle, Double2
Dezimal Decimal, SingleDouble2
Ledig Single, Double
Doppel Double
Alle Enumerationstypen (Enum) Der zugrunde liegende integrale Typ und jeder Typ, auf den der zugrunde liegende Typ erweitert wird.
Verkohlen Char, String
Char Array Char-Array, String
Beliebiger Typ Objekt
Jeder abgeleitete Typ Jeder Basistyp, von dem er abgeleitet wird 3.
Beliebiger Typ Alle implementierten Schnittstellen
Nichts Jeder Datentyp oder Objekttyp.

1 Per Definition erweitert sich jeder Datentyp auf sich selbst.

2 Konvertierungen von Integer, UInteger, Long, ULong, oder Decimal zu Single oder Double können zu einem Verlust der Genauigkeit, aber nie zu einem Verlust an Größe führen. In diesem Sinne verursachen sie keinen Informationsverlust.

3 Es mag überraschend erscheinen, dass eine Konvertierung von einem abgeleiteten Typ zu einem seiner Basistypen eine Erweiterung darstellt. Die Begründung besteht darin, dass der abgeleitete Typ alle Elemente des Basistyps enthält, sodass er als Instanz des Basistyps qualifiziert wird. In entgegengesetzter Richtung enthält der Basistyp keine neuen Elemente, die vom abgeleiteten Typ definiert sind.

Erweiternde Konvertierungen sind zur Laufzeit immer erfolgreich und führen nie zu Datenverlusten. Sie können sie immer implizit ausführen, unabhängig davon, ob die Option Strict-Anweisung die Typüberprüfung auf On oder Off festlegt.

Eingrenzungskonvertierungen

Die standardmäßigen einschränkenden Konvertierungen umfassen Folgendes:

  • Die umgekehrten Richtungen der erweiternden Konvertierungen in der vorherigen Tabelle (mit der Ausnahme, dass sich jeder Typ auf sich selbst erweitert)

  • Konvertierungen in beide Richtungen zwischen boolean und einem beliebigen numerischen Typ

  • Konvertierungen von einem beliebigen numerischen Typ in einen beliebigen Aufzählungstyp (Enum)

  • Konvertierungen in einer Richtung zwischen Zeichenfolge und einem beliebigen numerischen Typ, Booleanoder Datum

  • Konvertierungen von einem Datentyp oder Objekttyp in einen daraus abgeleiteten Typ

Einschränkende Konvertierungen sind zur Laufzeit nicht immer erfolgreich und können fehlschlagen oder zu Datenverlusten führen. Wenn der Zieldatentyp den zu konvertierenden Wert nicht empfangen kann, tritt ein Fehler auf. Beispielsweise kann eine numerische Konvertierung zu einem Überlauf führen. Sie können mit dem Compiler einschränkende Konvertierungen nicht implizit ausführen, es sei denn, die Option Strict-Anweisung legt die Typüberprüfungsoption auf Off fest.

Hinweis

Der Fehler bei der einschränkenden Konvertierung wird für Konvertierungen der Elemente in einer For Each…Next-Auflistung in die Schleifensteuerungsvariable unterdrückt. Weitere Informationen und Beispiele finden Sie im Abschnitt „Einschränkende Konvertierungen“ unter For Each...Next-Anweisung.

Empfohlene Verwendung von einschränkenden Konvertierungen

Sie verwenden eine Schmalungskonvertierung, wenn Sie wissen, dass der Quellwert ohne Fehler oder Datenverlust in den Zieldatentyp konvertiert werden kann. Wenn Sie ein String haben, von dem Sie wissen, dass es entweder "True" oder "False" enthält, können Sie das CBool-Schlüsselwort verwenden, um es in Boolean zu konvertieren.

Ausnahmen während der Konvertierung

Da erweiternde Konvertierungen immer erfolgreich sind, werden keine Ausnahmen ausgelöst. Wenn einschränkende Konvertierungen fehlschlagen, werden die folgenden Ausnahmen am häufigsten ausgelöst:

  • InvalidCastException — wenn keine Konvertierung zwischen den beiden Typen definiert ist

  • OverflowException — (nur integrale Typen), wenn der konvertierte Wert für den Zieltyp zu groß ist

Wenn eine Klasse oder Struktur eine CType-Funktion definiert, die als Konvertierungsoperator in diese Klasse oder Struktur oder aus ihr dient, kann sie jede beliebige Ausnahme auslösen, die sie für angemessen hält. Darüber hinaus könnte CType Visual Basic-Funktionen oder .NET Framework-Methoden aufrufen, die wiederum eine Vielzahl von Ausnahmen auslösen könnten.

Änderungen während der Referenztypkonvertierungen

Eine Konvertierung aus einem Verweistyp kopiert nur den Zeiger auf den Wert. Der Wert selbst wird weder kopiert noch geändert. Das einzige, was sich ändern kann, ist der Datentyp der Variablen, die den Zeiger enthält. Im folgenden Beispiel wird der Datentyp von der abgeleiteten Klasse in seine Basisklasse konvertiert, das Objekt, auf das beide Variablen jetzt verweisen, ist jedoch unverändert.

' 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  

Siehe auch