Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 , , Short Integer , Long , Decimal , , Single Double |
Byte- |
Byte , Short , , Integer UShort , UInteger , Long , ULong , , , Decimal , , Single Double |
Kurze |
Short , , Integer Long , Decimal , , Single Double |
UShort- |
UShort , , Integer UInteger , Long , ULong , Decimal , , Single Double |
Ganze Zahl |
Integer , Long , Decimal , Single , Double 2 |
UInteger- |
UInteger , Long , ULong , Decimal , Single , Double 2 |
Lang |
Long , , Decimal Single , Double 2 |
ULong- |
ULong , , Decimal Single , Double 2 |
Dezimal |
Decimal , Single Double 2 |
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,
Boolean
oder DatumKonvertierungen 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