(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

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:

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.

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).

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).

Weitere Informationen finden Sie in der C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft