Erweiternde und eingrenzende Konvertierungen (Visual Basic)
Eine wichtige Überlegung bei einer Typkonvertierung ist, ob das Ergebnis der Konvertierung innerhalb des Bereichs des Zieldatentyps liegt.
Eine erweiternde Konvertierung ändert einen Wert in einen Datentyp, der jeden möglichen Wert der ursprünglichen Daten zulassen kann. Erweiternde Konvertierungen behalten den Quellwert bei, können jedoch seine Darstellung ändern. Dies tritt auf, wenn Sie von einem integralen Typ in Decimal
oder von Char
in String
konvertieren.
Eine einschränkende Konvertierung ändert einen Wert in einen Datentyp, der möglicherweise nicht in der Lage ist, alle möglichen Werte zu speichern. Beispielsweise wird ein Fraktionswert gerundet, wenn er in einen integralen Typ konvertiert wird, und ein numerischer Typ, der in Boolean
konvertiert wird, wird auf True
oder False
reduziert.
Erweiterungskonvertierungen
Die folgende Tabelle enthält die standardmäßigen erweiternden Konvertierungen.
Datentyp | Erweiterung auf Datentypen1 |
---|---|
SByte | SByte , Short , Integer , Long , Decimal , Single , Double |
Byte | Byte , Short , UShort , Integer , UInteger , Long , ULong , Decimal , Single , Double |
Short | Short , Integer , Long , Decimal , Single , Double |
UShort | UShort , Integer , UInteger , Long , ULong , Decimal , Single , Double |
Integer | Integer , Long , Decimal , Single , Double 2 |
UInteger | UInteger , Long , ULong , Decimal , Single , Double 2 |
Long | Long , Decimal , Single , Double 2 |
ULong | ULong , Decimal , Single , Double 2 |
Dezimal | Decimal , Single , Double 2 |
Single | Single , Double |
Double | Double |
Alle Enumerationstypen (Enum) | Der zugrunde liegende integrale Typ und alle Typen, auf die sich der zugrunde liegende Typ erweitert |
Char | Char , String |
Char -Array |
Char -Array, String |
Beliebiger Typ | Object |
Alle abgeleiteten Typen | Jeder Basistyp, von dem der Typ abgeleitet wird3 |
Beliebiger Typ | Alle implementierten Schnittstellen |
Nothing | Alle Daten- oder Objekttypen |
1 Definitionsgemäß erweitert sich jeder Datentyp auf sich selbst.
2 Konvertierungen von Integer
, UInteger
, Long
, ULong
oder Decimal
zu Single
oder Double
können zu Genauigkeitsverlusten führen, jedoch nie zu Größenverlusten. In diesem Sinne entsteht kein Informationsverlust.
3 Es mag überraschend erscheinen, dass eine Konvertierung von einem abgeleiteten Typ in einen seiner Basistypen als erweiternd bezeichnet wird. Die Grund hierfür liegt darin, dass der abgeleitete Typ alle Elemente des Basistyps enthält, sodass er sich als Instanz des Basistyps qualifiziert. Umgekehrt enthält der Basistyp keine neuen Member, die vom abgeleiteten Typ definiert werden.
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 Enumerationstyp (
Enum
)Konvertierungen in beide Richtungen zwischen String und einem beliebigen numerischen Typ,
Boolean
oder DateKonvertierungen von einem Daten- oder Objekttyp in einen davon abgeleiteten Typ
Einschränkende Konvertierungen sind zur Laufzeit nicht immer erfolgreich und können fehlschlagen oder zu Datenverlusten führen. Ein Fehler tritt auf, wenn der Zieldatentyp den Wert, der konvertiert wird, nicht empfangen kann. 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 einschränkende Konvertierung, wenn Sie wissen, dass der Quellwert ohne Fehler oder Datenverlust in den Zieldatentyp konvertiert werden kann. Wenn Sie beispielsweise einen String
haben, der entweder „True“ oder „False“ enthält, können Sie das CBool
-Schlüsselwort verwenden, um ihn 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 zu oder von dieser Klasse oder Struktur dient, kann dieser CType
jede Ausnahme auslösen, die als angemessen erachtet wird. Darüber hinaus kann dieser CType
Visual Basic-Funktionen oder .NET Framework-Methoden aufrufen, die wiederum eine Vielzahl von Ausnahmen auslösen können.
Änderungen während der Konvertierung von Verweistypen
Bei einer Konvertierung aus einem Verweistyp wird nur den Zeiger auf den Wert kopiert. Der Wert selbst wird weder kopiert noch in irgendeiner Weise geändert. Lediglich der Datentyp der Variablen, die den Zeiger enthält, kann sich ändern. 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