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, Double2
UInteger UInteger, Long, ULong, Decimal, Single, Double2
Long Long, Decimal, Single, Double2
ULong ULong, Decimal, Single, Double2
Dezimal Decimal, Single, Double2
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 Date

  • Konvertierungen 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  

Siehe auch