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. Dies kann z. B string
. nicht implizit in int
. Daher können Sie die Zeichenfolge "Hello" nach dem Deklarieren i
als " int
Hello" nicht zuweisen, 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 können z. B. über eine ganzzahlige Variable verfügen, die Sie an eine Methode übergeben müssen, deren Parameter eingegeben double
wird. 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. Umwandlungen sind erforderlich, wenn Informationen in der Konvertierung verloren gehen oder die Konvertierung aus anderen Gründen nicht erfolgreich ist. 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
Parse
Methoden 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 bigNum
wird.
// 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 jedoch keine Konvertierung erfolgen kann, ohne dass Informationen verloren gehen, erfordert der Compiler, dass Sie eine explizite Konvertierung durchführen, die als Umwandlung bezeichnet wird. Eine Umwandlung ist eine Möglichkeit, die Konvertierung explizit vorzunehmen. Dies weist darauf hin, dass Der Datenverlust möglicherweise auftritt oder die Umwandlung zur Laufzeit fehlschlägt. Wenn Sie eine Umwandlung durchführen möchten, geben Sie den Zieltyp in Klammern vor dem Ausdruck an, den Sie konvertieren möchten. Das folgende Programm wandelt ein Double in ein Int um. Das Programm wird nicht ohne die Umwandlung kompiliert.
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" .
Für Verweistypen ist eine explizite Umwandlung erforderlich, wenn Sie von einem Basistyp in einen abgeleiteten Typ konvertieren müssen:
Ein Umwandlungsvorgang zwischen Referenztypen ändert nicht den Laufzeittyp des zugrunde liegenden Objekts. er ändert nur den Typ des Werts, der als Verweis auf dieses Objekt verwendet wird. Weitere Informationen finden Sie unter Polymorphismus.
Typkonvertierungs ausnahmen zur Laufzeit
In einigen Verweistypkonvertierungen kann der Compiler nicht bestimmen, ob eine Umwandlung gültig ist. Es ist möglich, dass ein Umwandlungsvorgang ordnungsgemäß kompiliert wird, um zur Laufzeit fehlschlagen zu können. Wie im folgenden Beispiel gezeigt, wird ein Typ, der zur Laufzeit fehlschlägt, dazu führen, dass ein InvalidCastException Fehler ausgelöst wird.
Animal a = new Mammal();
Reptile r = (Reptile)a; // InvalidCastException at run time
Explizites Umwandeln des Arguments a
in eine Reptile
gefährliche Annahme. Es ist sicherer, keine Annahmen zu treffen, sondern den Typ zu überprüfen. C# stellt den is
Operator bereit, mit dem Sie die Kompatibilität testen können, bevor Sie eine Umwandlung durchführen. Weitere Informationen finden Sie unter How to safely cast using pattern matching and the as and is operators.
C#-Sprachspezifikation
Weitere Informationen finden Sie im Abschnitt "Konvertierungen " der C#-Sprachspezifikation.