Umwandlung und Typkonvertierungen (C#-Programmierhandbuch)

Aktualisiert: Juli 2008

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

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 longlong (C#-Referenz) (8-Byte-Ganzzahl) jeden Wert speichern, der von einem intint (C#-Referenz) (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 ein doubledouble (C#-Referenz) in einen intint (C#-Referenz) 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
        // 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 über Umwandlungen und Typkonvertierungen finden Sie in den folgenden Abschnitten im C#-Programmiersprachenspezifikation:

  • 7.6.6 Typumwandlungsausdrücke

  • 6.1 Implizite Konvertierungen

  • 6.2 Explizite Konvertierungen

Siehe auch

Aufgaben

Gewusst wie: Konvertieren einer Zeichenfolge in einen ganzzahligen Typ (C#-Programmierhandbuch)

Konzepte

C#-Programmierhandbuch

Verallgemeinerte Typkonvertierung

Explizite Konvertierung

Konvertieren exportierter Typen

Referenz

Typen (C#-Programmierhandbuch)

Operator () (C#-Referenz)

explicit (C#-Referenz)

implicit (C#-Referenz)

Konvertierungsoperatoren (C#-Programmierhandbuch)

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

Juli 2008

Inhalt u. a. zur Einführung hinzugefügt.

Korrektur inhaltlicher Fehler.