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.
Da C# zur Kompilierungszeit statisch eingegeben wird, kann sie nach der Deklaration einer Variablen nicht erneut deklariert oder einem Wert eines anderen Typs zugewiesen werden, es sei denn, dieser Typ ist implizit in den Typ der Variablen konvertierbar. Zum Beispiel kann der Tag string nicht implizit in int konvertiert werden. Daher können Sie die Zeichenfolge "Hello" nicht zuweisen, nachdem Sie i als int erklärt haben, wie der folgende Code zeigt:
int i;
// error CS0029: can't implicitly convert type 'string' to 'int'
i = "Hello";
Möglicherweise müssen Sie jedoch manchmal einen Wert in eine Variable oder einen Methodenparameter eines anderen Typs kopieren. Sie haben beispielsweise eine Ganzzahlvariable, die Sie an eine Methode übergeben müssen, deren Parameter als double typisiert ist. Oder Sie müssen möglicherweise einer Variablen eines Schnittstellentyps eine Klassenvariable zuweisen. Diese Arten von Vorgängen werden als Typkonvertierungen bezeichnet. In C# können Sie die folgenden Arten von Konvertierungen ausführen:
Implizite Konvertierungen: Es ist keine spezielle Syntax erforderlich, da die Konvertierung immer erfolgreich ist und keine Daten verloren gegangen sind. Beispiele sind Konvertierungen von kleineren zu größeren integralen Typen, Konvertierungen von abgeleiteten Klassen in Basisklassen und Span-Konvertierungen.
Explizite Konvertierungen (Umwandlungen): Explizite Konvertierungen erfordern einen Umwandlungsausdruck. Eine Umwandlung ist erforderlich, wenn Informationen bei einer Konvertierung verloren gehen können oder wenn die Konvertierung aus anderen Gründen fehlschlagen könnte. Typische Beispiele sind die numerische Konvertierung in einen Typ, der weniger Genauigkeit oder einen kleineren Bereich aufweist, und die Konvertierung einer Basisklasseninstanz in eine abgeleitete Klasse.
Benutzerdefinierte Konvertierungen: Benutzerdefinierte Konvertierungen verwenden spezielle Methoden, die Sie definieren können, um explizite und implizite Konvertierungen zwischen benutzerdefinierten Typen zu aktivieren, die nicht über eine von der Basisklasse abgeleitete Klassenbeziehung verfügen. Weitere Informationen finden Sie unter Benutzerdefinierte Konvertierungsoperatoren.
Konvertierungen mit Hilfsklassen: Zum Konvertieren zwischen nicht kompatiblen Typen, z. B. ganze Zahlen und System.DateTime Objekte, oder hexadezimale Zeichenfolgen und Bytearrays, können Sie die System.BitConverter Klasse, die System.Convert Klasse und die
ParseMethoden der integrierten numerischen Typen verwenden, z Int32.Parse. B. . Weitere Informationen finden Sie in den folgenden Artikeln:So konvertieren Sie zwischen hexadezimalen Zeichenfolgen und numerischen Typen
Implizite Konvertierungen
Bei integrierten numerischen Typen kann eine implizite Konvertierung vorgenommen werden, wenn der zu speichernde Wert in die Variable passt, ohne abgeschnitten oder abgerundet zu werden. Bei integralen Typen bedeutet diese Einschränkung, dass der Bereich des Quelltyps eine richtige Teilmenge des Bereichs für den Zieltyp ist. Beispielsweise kann eine Variable vom Typ Long (64-Bit-Ganzzahl) einen beliebigen Wert speichern, den ein Int (32-Bit-Ganzzahl) speichern kann. Im folgenden Beispiel konvertiert der Compiler implizit den Wert von num rechts in einen Typ long , bevor er ihm zugewiesen bigNumwird.
// Implicit conversion. A long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
Eine vollständige Liste aller impliziten numerischen Konvertierungen finden Sie im Abschnitt "Implizite numerische Konvertierungen " des Artikels " Integrierte numerische Konvertierungen" .
Bei Referenztypen ist eine implizite Konvertierung immer von einer Klasse in eine der direkten oder indirekten Basisklassen oder Schnittstellen vorhanden. Es ist keine spezielle Syntax erforderlich, da eine abgeleitete Klasse immer alle Member einer Basisklasse enthält.
Derived d = new Derived();
// Always OK.
Base b = d;
Explizite Konvertierungen
Wenn allerdings eine Konvertierung nicht ohne möglichen Informationsverlust durchgeführt werden kann, fordert der Compiler eine explizite Konvertierung; diese wird als Umwandlung bezeichnet. Ein Cast ist eine Möglichkeit, die Konversion explizit durchzuführen. Er zeigt an, dass Sie sich bewusst sind, dass es zu Datenverlusten kommen kann oder dass der Cast zur Ausführungszeit fehlschlagen könnte. Um einen Cast durchzuführen, geben Sie den Zieltyp in Klammern vor dem Ausdruck an, den Sie umwandeln möchten. Das folgende Programm wandelt ein double in ein int um. Das Programm lässt sich ohne den Cast nicht kompilieren.
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
Console.WriteLine(a);
// Output: 1234
Eine vollständige Liste der unterstützten expliziten numerischen Konvertierungen finden Sie im Abschnitt "Explizite numerische Konvertierungen " des Artikels " Integrierte numerische Konvertierungen" .
Eine explizite Umwandlung ist für Verweistypen erforderlich, wenn Sie von einer Basisklasse in eine abgeleitete Klasse konvertieren möchten:
Ein Umwandlungsvorgang zwischen Verweistypen ändert nicht den Laufzeittypen des zugrunde liegenden Objekts; er ändert lediglich den Typ des Wertes, der als Verweis auf das Objekt verwendet wird. Weitere Informationen finden Sie unter Polymorphismus.
Typkonvertierungsausnahmen zur Laufzeit
Bei einigen Referenztypkonvertierungen kann der Compiler nicht feststellen, ob ein Cast gültig ist. Es ist möglich, dass ein Umwandlungsvorgang, der ordnungsgemäß kompiliert, zur Laufzeit fehlschlägt. Eine fehlgeschlagene Typumwandlung zur Laufzeit löst wie in folgendem Beispiel dargestellt eine InvalidCastException aus.
Animal a = new Mammal();
Reptile r = (Reptile)a; // InvalidCastException at run time
Das explizite Casting des Arguments a in ein Reptile impliziert eine gefährliche Annahme. Es ist sicherer, keine Annahmen zu treffen, sondern den Typ zu überprüfen. C# bietet den is-Operator, mit dem Sie die Kompatibilität prüfen können, bevor Sie die Umwandlung tatsächlich durchführen. Weitere Informationen finden Sie unter Vorgehensweise: Sicheres Umwandeln mit Musterabgleich und den Operatoren „as“ und „is“.
C#-Sprachspezifikation
Weitere Informationen finden Sie im Abschnitt "Konvertierungen " der C#-Sprachspezifikation.