Erweiternde und eingrenzende Konvertierungen (Visual Basic)

Eine wichtige Erwägung bei einer Typkonvertierung besteht darin, ob sich das Ergebnis der Konvertierung innerhalb des Bereichs des Zieldatentyps befindet.

Eine Erweiterung der Konvertierung ändert einen Wert in einen Datentyp, der einen beliebigen möglichen Wert der ursprünglichen Daten zulassen kann. Die Verbreiterung von Konvertierungen behält den Quellwert bei, kann jedoch die Darstellung ändern. Dies tritt auf, wenn Sie von einem integralen Typ in Decimaloder von Char zu .String

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 Bruchwert gerundet, wenn er in einen integralen Typ konvertiert wird, und ein numerischer Typ, in Boolean den konvertiert wird, auf ein oder FalseTrue mehrere reduziert wird.

Erweiterungskonvertierungen

Die folgende Tabelle zeigt die standardmäßigen Verbreiterungskonvertierungen.

Datentyp Erweitert auf Datentypen 1
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, , DecimalSingleDouble 2
ULong ULong, , DecimalSingleDouble 2
Dezimal Decimal, SingleDouble2
Single Single, Double
Double Double
Jeder Aufzählungstyp (Aufzählung) Der zugrunde liegende integrale Typ und jeder Typ, auf den sich der zugrunde liegende Typ erweitert.
Char Char, String
Char-Array Char Array String
Beliebiger Typ Object
Jeder abgeleitete Typ Jeder Basistyp, von dem er abgeleitet wird 3.
Beliebiger Typ Jede Schnittstelle, die sie implementiert.
Nichts Jeder Datentyp oder Objekttyp.

1 Nach Definition erweitert sich jeder Datentyp auf sich selbst.

2 Konvertierungen von Integer, UInteger, Long, ULongoder zu oder DecimalSingle kann Double zu Einem Verlust der Genauigkeit führen, aber nie zu Verlust der Größe. In diesem Sinne verursachen sie keinen Informationsverlust.

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

Die Verbreiterung von Konvertierungen ist zur Laufzeit immer erfolgreich und führt nie zu Datenverlust. Sie können sie immer implizit ausführen, unabhängig davon, ob die Option Strict-Anweisung die Typüberprüfung auf On oder auf legt Off.

Eingrenzungskonvertierungen

Die standardmäßigen Schmalungskonvertierungen umfassen Folgendes:

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

  • Konvertierungen in beiden Richtungen zwischen booleschen und jedem numerischen Typ

  • Konvertierungen von jedem numerischen Typ in einen beliebigen aufgezählten Typ (Enum)

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

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

Die Verschränkung von Konvertierungen ist zur Laufzeit nicht immer erfolgreich und kann fehlschlagen oder datenverlusten. Ein Fehler tritt auf, wenn der Zieldatentyp den konvertierten Wert nicht empfangen kann. Beispielsweise kann eine numerische Konvertierung zu einem Überlauf führen. Der Compiler ermöglicht es Ihnen nicht, implizite Konvertierungen auszuführen, es sei denn, die Option Strict-Anweisung legt die Typüberprüfung auf Off.

Hinweis

Der Fehler bei der Einschränkungskonvertierung wird für Konvertierungen aus den Elementen in einer For Each…Next Auflistung in die Schleifensteuerelementvariable unterdrückt. Weitere Informationen und Beispiele finden Sie im Abschnitt "Schmale Konvertierungen" in For Each... Next-Anweisung.

Verwendung von Schmalungskonvertierungen

Sie verwenden eine schmale Konvertierung, wenn Sie wissen, dass der Quellwert ohne Fehler oder Datenverlust in den Zieldatentyp konvertiert werden kann. Wenn Sie beispielsweise wissen String , dass sie entweder "True" oder "False" enthält, können Sie das CBool Schlüsselwort verwenden, um es in Booleanzu konvertieren.

Ausnahmen während der Konvertierung

Da die Verbreiterung von Konvertierungen immer erfolgreich ist, lösen sie keine Ausnahmen aus. Verengung von Konvertierungen, wenn sie fehlschlagen, lösen die folgenden Ausnahmen am häufigsten aus:

  • 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 oder aus dieser Klasse oder Struktur dient, kann jede Ausnahme ausgelöst werden, die CType sie als geeignet erachtet. Darüber hinaus können Visual Basic CType Funktionen oder .NET Framework Methoden aufgerufen werden, 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 Variable, die den Zeiger hält. Im folgenden Beispiel wird der Datentyp aus der abgeleiteten Klasse in seine Basisklasse konvertiert, aber das Objekt, auf das beide Variablen jetzt zeigen, ist 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  

Weitere Informationen