Erweiternde und eingrenzende Konvertierungen (Visual Basic)

Ein wichtiger Aspekt 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 einen beliebigen möglichen Wert der ursprünglichen Daten zulassen kann. Erweiternde Konvertierungen behalten den Quellwert bei, können aber seine Darstellung ändern. Dies tritt auf, wenn Sie von einem ganzzahligen 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 Bruchwert gerundet, wenn er in einen ganzzahligen Typ konvertiert wird, und ein numerischer Typ, der in konvertiert Boolean wird, wird entweder auf True oder False reduziert.

Erweiterungskonvertierungen

Die folgende Tabelle zeigt die standardmäßigen Erweiterungskonvertierungen.

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 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
Beliebiger enumerationsierter Typ (Enumeration) Der zugrunde liegende integrale Typ und jeder Typ, auf den der zugrunde liegende Typ erweitert wird.
Char Char, String
Char-Array Char Array String
Beliebiger Typ Object
Beliebiger abgeleiteter Typ Jeder Basistyp, von dem er abgeleitet wird 3.
Beliebiger Typ Jede schnittstelle, die implementiert wird.
Nichts Ein beliebiger Datentyp oder Objekttyp.

1 Definitionsgemäß wird jeder Datentyp auf sich selbst erweitert.

2 Konvertierungen von Integer , , , oder in oder können zu UInteger Long ULong Decimal Single Double Genauigkeitsverlusten führen, aber nie zu Größenverlusten. In diesem Sinne verursachen sie keinen Informationsverlust.

3 Es mag überraschend erscheinen, dass eine Konvertierung von einem abgeleiteten Typ in einen seiner Basistypen erweitert wird. Die Begründung ist, dass der abgeleitete Typ alle Member des Basistyps enthält, sodass er als Instanz des Basistyps qualifiziert wird. In umgekehrter Richtung enthält der Basistyp keine neuen Member, die vom abgeleiteten Typ definiert werden.

Erweiterungskonvertierungen 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 den Schalter für die Typüberprüfung auf On oder auf Off festlegt.

Eingrenzungskonvertierungen

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

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

  • Konvertierungen in beide Richtungen zwischen booleschen Werten und beliebigen numerischen Typen

  • Konvertierungen von einem beliebigen numerischen Typ in einen beliebigen enumerationsierten Typ ( Enum )

  • Konvertierungen in beide Richtungen zwischen String und einem beliebigen numerischen Typ, Boolean , oder Date

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

Einschränkende Konvertierungen sind zur Laufzeit nicht immer erfolgreich und können fehlschlagen oder Datenverluste verursachen. 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 lässt nicht zu, dass Sie einschränkende Konvertierungen implizit ausführen, es sei denn, die Option Strict-Anweisung legt den Schalter für die Typüberprüfung auf Off fest.

Hinweis

Der Fehler bei der einschränkenden Konvertierung wird für Konvertierungen von den Elementen in einer Auflistung in For Each…Next die Schleifensteuerungsvariable unterdrückt. Weitere Informationen und Beispiele finden Sie im Abschnitt "Einschränkende Konvertierungen" unter For Each... Nächste Anweisung.

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 über eine verfügen, String von der Sie wissen, dass sie entweder "True" oder "False" enthält, können Sie das CBool Schlüsselwort verwenden, um es in zu Boolean konvertieren.

Ausnahmen während der Konvertierung

Da Erweiterungskonvertierungen immer erfolgreich sind, werden keine Ausnahmen ausgelöst. Einschränkende Konvertierungen, wenn sie fehlschlagen, auslösen am häufigsten die folgenden Ausnahmen:

  • 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 dienen soll, kann diese jede Ausnahme auslösen, die CType sie für geeignet hält. Darüber hinaus CType kann dies Visual Basic Funktionen oder .NET Framework Methoden aufrufen, die wiederum eine Vielzahl von Ausnahmen auslösen können.

Änderungen bei Verweistypkonvertierungen

Eine Konvertierung aus einem Verweistyp kopiert nur den Zeiger auf den Wert. Der Wert selbst wird weder kopiert noch in irgendeiner Weise 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 die Basisklasse konvertiert, aber das Objekt, auf das beide Variablen jetzt verweisen, bleibt 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