Umwandlung und Typkonvertierungen (C#-Programmierhandbuch)
Da C# zur Kompilierzeit statisch typisiert ist, kann eine Variable, nachdem sie deklariert wurde, nur dann erneut deklariert oder zum Speichern eines anderen Typs verwendet werden, wenn der betreffende Typ in den Typ der Variablen konvertiert werden kann. Beispielsweise ist keine Konvertierung von einer ganzen Zahl in eine beliebigen Zeichenfolge möglich. Wenn Sie i als ganze Zahl deklariert haben, können Sie dieser daher nicht die Zeichenfolge "Hello" zuweisen, wie im folgenden Code dargestellt.
int i;
i = "Hello"; // Error: "Cannot implicitly convert type 'string' to 'int'"
Eventuell ist es manchmal jedoch erforderlich, einen Wert in einen Variablenparameter oder einen Methodenparameter eines anderen Typs zu kopieren. So verfügen Sie z. B. über eine ganzzahlige Variable, die Sie an eine Methode übergeben müssen, deren Parameter als double typisiert ist. Oder Sie müssen einer Variablen eines Schnittstellentyps eine Klassenvariable zuweisen. Solche Operationen werden als Typkonvertierungen bezeichnet. In C# können Sie die folgenden Arten von Konvertierungen ausführen:
Implizite Konvertierungen: Es wird keine besondere Syntax benötigt, da die Konvertierung typsicher ist und keine Daten verloren gehen. Die Beispiele umfassen Konvertierungen von kleineren in größere ganzzahlige Typen und Konvertierungen von abgeleiteten Klassen in Basisklassen.
Explizite Konvertierungen (Umwandlungen): Für explizite Konvertierungen ist ein Typumwandlungsoperator erforderlich. Eine Umwandlung ist erforderlich, wenn Informationen bei der Konvertierung verloren gehen können oder wenn die Konvertierung aus anderen Gründen fehlschlägt. Typische Beispiele hierfür 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 werden mit besonderen Methoden durchgeführt, die Sie definieren können, um explizite und implizite Konvertierungen zwischen benutzerdefinierten Typen durchzuführen, die keine von einer Basisklasse abgeleitete Klassenbeziehung aufweisen. Weitere Informationen finden Sie unter Konvertierungsoperatoren (C#-Programmierhandbuch).
Konvertierungen mit Hilfsklassen: Um zwischen nicht kompatiblen Typen, z. B. ganzen Zahlen und System.DateTime-Objekten, oder Hexadezimalzeichenfolgen und Bytearrays, zu konvertieren, können Sie die System.BitConverter-Klasse verwenden, die System.Convert-Klasse und die Parse-Methoden der integrierten numerischen Typen, wie z. B. Int32.Parse. Weitere Informationen finden Sie unter Gewusst wie: Konvertieren eines Bytearrays in einen ganzzahligen Typ (C#-Programmierhandbuch), Gewusst wie: Konvertieren einer Zeichenfolge in einen ganzzahligen Typ (C#-Programmierhandbuch) und Gewusst wie: Konvertieren zwischen Hexadezimalzeichenfolgen und numerischen Typen (C#-Programmierhandbuch).
Implizite Konvertierungen
Für integrierte numerische Typen kann eine implizite Konvertierung durchgeführt werden, wenn der zu speichernde Wert in die Variable passt, ohne abgeschnitten oder gerundet zu werden. So kann z. B. eine Variable vom Typ long (8-Byte-Ganzzahl) jeden Wert speichern, der von einem int (4 Byte auf einem 32-Bit-Computer) gespeichert werden kann. Im folgenden Beispiel konvertiert der Compiler implizit den Wert rechts in den Typ long und weist den Wert anschließend bigNum zu.
// Implicit conversion. num 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 unter Tabelle für implizite numerische Konvertierungen (C#-Referenz).
Für Referenztypen ist eine implizite Konvertierung immer aus einer Klasse in eine der direkten oder indirekten Basisklassen oder Schnittstellen vorhanden. Es ist keine besondere Syntax erforderlich, da eine abgeleitete Klasse immer alle Member einer Basisklasse enthält.
Derived d = new Derived();
Base b = d; // Always OK.
Explizite Konvertierungen
Wenn jedoch eine Konvertierung nicht ohne das Risiko eines Datenverlusts durchgeführt werden kann, ist für den Compiler eine explizite Konvertierung erforderlich, die als Umwandlung bezeichnet werden kann. Eine Umwandlung ist eine Möglichkeit, den Compiler darüber zu informieren, dass Sie die Konvertierung durchführen möchten und dass Ihnen klar ist, dass ein Datenverlust auftreten kann. Um eine Umwandlung durchzuführen, legen Sie den Typ, in den Sie umwandeln, in Klammern vor dem zu konvertierenden Wert oder der zu konvertierenden Variablen fest. Im folgenden Programm wird double in int umgewandelt. Ohne die Typumwandlung kann das Programm nicht kompiliert werden.
class Test
{
static void Main()
{
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
System.Console.WriteLine(a);
}
}
// Output: 1234
Eine Liste der expliziten numerischen Konvertierungen, die zulässig sind, finden Sie unter Tabelle für explizite numerische Konvertierungen (C#-Referenz).
Für Referenztypen ist eine explizite Umwandlung erforderlich, wenn Sie von einem Basistyp in einen abgeleiteten Typ umwandeln müssen:
// Create a new derived type.
Giraffe g = new Giraffe();
// Implicit conversion to base type is safe.
Animal a = g;
// Explicit conversion is required to cast back
// to derived type. Note: This will compile but will
// throw an exception at run time if the right-side
// object is not in fact a Giraffe.
Giraffe g2 = (Giraffe) a;
Ein Umwandlungsvorgang zwischen Referenztypen führt nicht zu einer Änderung des Laufzeittyps des zugrunde liegenden Objekts, sondern lediglich zu einer Änderung des Typs für den Wert, der als Verweis auf dieses Objekt verwendet wird. Weitere Informationen finden Sie unter Polymorphismus (C#-Programmierhandbuch).
Typkonvertierungsausnahmen zur Laufzeit
In einigen Referenztypkonvertierungen kann der Compiler nicht bestimmen, ob eine Umwandlung gültig ist. Es ist möglich, dass eine Umwandlungsoperation, die ordnungsgemäß kompiliert, zur Laufzeit nicht ordnungsgemäß ausgeführt wird. Wie im folgenden Beispiel dargestellt, führt eine Typumwandlung, die zur Laufzeit fehlschlägt, zm Auslösen einer InvalidCastException.
class Animal
{
public void Eat() { Console.WriteLine("Eating."); }
public override string ToString()
{
return "I am an animal.";
}
}
class Reptile : Animal { }
class Mammal : Animal { }
class UnSafeCast
{
static void Main()
{
Test(new Mammal());
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
static void Test(Animal a)
{
// Cause InvalidCastException at run time
// because Mammal is not convertible to Reptile.
Reptile r = (Reptile)a;
}
}
C# liefert die Operatoren is und as, damit Sie die Kompatibilität testen können, bevor Sie die Typumwandlung durchführen. Weitere Informationen finden Sie unter Gewusst wie: Sichere Umwandlung mit den Operatoren "as" und "is" (C#-Programmierhandbuch).
C#-Programmiersprachenspezifikation
Weitere Informationen finden Sie in der C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.
Siehe auch
Aufgaben
Gewusst wie: Konvertieren einer Zeichenfolge in einen ganzzahligen Typ (C#-Programmierhandbuch)
Referenz
Typen (C#-Programmierhandbuch)
Konvertierungsoperatoren (C#-Programmierhandbuch)
Konzepte
Verallgemeinerte Typkonvertierung
Konvertieren exportierter Typen
Änderungsprotokoll
Datum |
Versionsgeschichte |
Grund |
---|---|---|
Juni 2010 |
Definition von expliziten Konvertierungen in der Einführung überarbeitet. |
Kundenfeedback. |