Umwandlung und Typkonvertierungen (C#-Programmierhandbuch)Casting and Type Conversions (C# Programming Guide)

Weil C# zur Laufzeit statisch kompiliert ist, kann eine Variable, nachdem sie deklariert wurde, nicht noch einmal deklariert oder dazu verwendet werden, Werte anderer Typen zu speichern, es sei denn, der Wert ist in den Wert der Variablen konvertierbar.Because C# is statically-typed at compile time, after a variable is declared, it cannot be declared again or used to store values of another type unless that type is convertible to the variable's type. Es gibt z.B. keine Konvertierung einer Ganzzahl in eine willkürliche Zeichenfolge.For example, there is no conversion from an integer to any arbitrary string. Deshalb können Sie, nachdem Sie i Ganzzahl deklariert haben, die Zeichenfolge „Hello“ nicht zuweisen, wie in folgendem Codebeispiel gezeigt.Therefore, after you declare i as an integer, you cannot assign the string "Hello" to it, as is shown in the following code.

int i;  
i = "Hello"; // Error: "Cannot implicitly convert type 'string' to 'int'"  

Manchmal müssen Sie möglicherweise einen Wert in eine Variable oder einen Methodenparameter eines anderen Typen kopieren.However, you might sometimes need to copy a value into a variable or method parameter of another type. Sie haben z.B. möglicherweise eine Ganzzahlvariable, die Sie an eine Methode übergeben müssen, deren Parameter vom Type double ist.For example, you might have an integer variable that you need to pass to a method whose parameter is typed as double. Möglicherweise müssen Sie auch einer Variablen eines Schnittstellentyps eine Klassenvariable zuweisen.Or you might need to assign a class variable to a variable of an interface type. Derartige Vorgänge werden als Typkonvertierungen bezeichnet.These kinds of operations are called type conversions. In C# können Sie folgende Arten von Konvertierungen durchführen:In C#, you can perform the following kinds of conversions:

  • Implizite Konvertierung: Es ist keine besondere Syntax erforderlich, da die Konvertierung typsicher ist, und keine Daten verloren gehen.Implicit conversions: No special syntax is required because the conversion is type safe and no data will be lost. Beispiele sind Konvertierungen von kleinere in größere Ganzzahltypen und Konvertierungen von abgeleiteten in Basisklassen.Examples include conversions from smaller to larger integral types, and conversions from derived classes to base classes.

  • Explizite Konvertierungen (Umwandlungen): Für explizite Konvertierungen ist ein Umwandlungsoperator erforderlich.Explicit conversions (casts): Explicit conversions require a cast operator. Eine Umwandlung ist erforderlich, wenn Informationen bei einer Konvertierung verloren gehen können oder wenn die Konvertierung aus anderen Gründen fehlschlagen könnte.Casting is required when information might be lost in the conversion, or when the conversion might not succeed for other reasons. Häufig auftretende Beispiele sind u.a. numerische Konvertierungen in einen Typen, der eine geringere Genauigkeit oder einen kleineren Bereich aufweist, oder Konvertierungen einer Instanz einer Basisklasse in eine abgeleitete Klasse.Typical examples include numeric conversion to a type that has less precision or a smaller range, and conversion of a base-class instance to a derived class.

  • Benutzerdefinierte Konvertierungen: Benutzerdefinierte Konvertierungen werden anhand spezieller Methoden durchgeführt, die Sie definieren können, um explizite und implizite Konvertierungen zwischen benutzerdefinierten Typen zu ermöglichen, die nicht in einem Verhältnis „Basisklasse – abgeleitete Klasse“ zueinander stehen.User-defined conversions: User-defined conversions are performed by special methods that you can define to enable explicit and implicit conversions between custom types that do not have a base class–derived class relationship. Weitere Informationen finden Sie unter Konvertierungsoperatoren.For more information, see Conversion Operators.

  • Konvertierungen mit Hilfsklassen:Für eine Konvertierung von nicht kompatiblen Typen, z.B. von ganzen Zahlen und System.DateTime-Objekten oder von Hexadezimalzeichenfolgen und Bytearrays, können Sie die System.BitConverter-Klasse, die System.Convert-Klasse und die Parse-Methoden der integrierten numerischen Typen (z.B. Int32.Parse) verwenden.Conversions with helper classes: To convert between non-compatible types, such as integers and System.DateTime objects, or hexadecimal strings and byte arrays, you can use the System.BitConverter class, the System.Convert class, and the Parse methods of the built-in numeric types, such as Int32.Parse. Weitere Informationen finden Sie unter Vorgehensweise: Konvertieren eines Bytearrays in einen ganzzahligen Typ, Vorgehensweise: Konvertieren einer Zeichenfolge in eine Zahl und Vorgehensweise: Konvertieren zwischen Hexadezimalzeichenfolgen und numerischen Typen.For more information, see How to: Convert a byte Array to an int, How to: Convert a String to a Number, and How to: Convert Between Hexadecimal Strings and Numeric Types.

Implizite KonvertierungenImplicit Conversions

Eine implizite Konvertierung kann für integrierte numerische Typen durchgeführt werden, wenn der zu speichernde Wert in die Variable passt, ohne abgeschnitten oder abgerundet zu werden.For built-in numeric types, an implicit conversion can be made when the value to be stored can fit into the variable without being truncated or rounded off. Eine Variable den Typs long (8-Byte-Ganzzahl) kann z.B. jeden Wert speichern, den eine Variable des Typs int (4-Bytes auf einem 32-Bit-Computer) speichern kann.For example, a variable of type long (8 byte integer) can store any value that an int (4 bytes on a 32-bit computer) can store. In folgendem Beispiel konvertiert der Compiler den Wert auf der rechten Seite implizit in einen Typ long, bevor er ihn bigNum zuweist.In the following example, the compiler implicitly converts the value on the right to a type long before assigning it to bigNum.

// 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.For a complete list of all implicit numeric conversions, see Implicit Numeric Conversions Table.

Eine implizite Konvertierungen für Verweistypen von einer Klasse in jede ihrer direkten oder indirekten Basisklassen oder Schnittstellen ist immer möglich.For reference types, an implicit conversion always exists from a class to any one of its direct or indirect base classes or interfaces. Es ist keine spezielle Syntax erforderlich, da eine abgeleitete Klasse immer alle Member der Basisklasse enthält.No special syntax is necessary because a derived class always contains all the members of a base class.

Derived d = new Derived();  
Base b = d; // Always OK.  

Explizite KonvertierungenExplicit Conversions

Wenn allerdings eine Konvertierung nicht ohne möglichen Informationsverlust durchgeführt werden kann, fordert der Compiler eine explizite Konvertierung; diese wird als Umwandlung bezeichnet.However, if a conversion cannot be made without a risk of losing information, the compiler requires that you perform an explicit conversion, which is called a cast. Eine Umwandlung bietet die Möglichkeit, den Compiler explizit zu verständigen, dass Sie eine Konvertierung vornehmen möchten, und dass es Ihnen bewusst ist, dass dies einen Datenverlust zur Folge haben kann.A cast is a way of explicitly informing the compiler that you intend to make the conversion and that you are aware that data loss might occur. Wenn Sie eine Umwandlung durchführen möchten, geben Sie den Typ, in den umgewandelt werden soll, in Klammern am Anfang des zu konvertierenden Wertes oder der zu konvertierenden Variablen an.To perform a cast, specify the type that you are casting to in parentheses in front of the value or variable to be converted. Das folgende Programm wandelt ein double in ein int um. Das Programm führt ohne die Umwandlung keine Kompilierung durch.The following program casts a double to an int. The program will not compile without the cast.

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 zulässigen expliziten numerischen Konvertierungen finden Sie unter Tabelle für explizite numerische Konvertierungen.For a list of the explicit numeric conversions that are allowed, see Explicit Numeric Conversions Table.

Eine explizite Umwandlung ist für Verweistypen erforderlich, wenn Sie von einer Basisklasse in eine abgeleitete Klasse konvertieren möchten:For reference types, an explicit cast is required if you need to convert from a base type to a derived type:

// 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 Verweistypen ändert nicht den Laufzeittypen des zugrunde liegenden Objekts; er ändert lediglich den Typ des Wertes, der als Verweis auf das Objekt verwendet wird.A cast operation between reference types does not change the run-time type of the underlying object; it only changes the type of the value that is being used as a reference to that object. Weitere Informationen finden Sie unter Polymorphie.For more information, see Polymorphism.

Typkonvertierungsausnahmen zur LaufzeitType Conversion Exceptions at Run Time

In manchen Verweistypkonvertierungen kann der Compiler nicht bestimmen, ob eine Umwandlung zulässig wäre.In some reference type conversions, the compiler cannot determine whether a cast will be valid. Es ist möglich, dass ein Umwandlungsvorgang, der ordnungsgemäß kompiliert, zur Laufzeit fehlschlägt.It is possible for a cast operation that compiles correctly to fail at run time. Eine fehlgeschlagene Typumwandlung zur Laufzeit löst wie in folgendem Beispiel dargestellt eine InvalidCastException aus.As shown in the following example, a type cast that fails at run time will cause an InvalidCastException to be thrown.


using System;

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# stellt die Operatoren is und as bereit, mit denen Sie vor einer Umwandlung auf Kompatibilität prüfen können.C# provides the is and as operators to enable you to test for compatibility before actually performing a cast. Weitere Informationen finden Sie unter Vorgehensweise: Sichere Umwandlung mit den Operatoren „as“ und „is“.For more information, see How to: Safely Cast by Using as and is Operators.

C#-ProgrammiersprachenspezifikationC# Language Specification

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

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
TypenTypes
()-Operator() Operator
explicitexplicit
implicitimplicit
KonvertierungsoperatorenConversion Operators
Verallgemeinerte TypkonvertierungGeneralized Type Conversion
Exportierte TypkonvertierungExported Type Conversion
Gewusst wie: Konvertieren einer Zeichenfolge in eine ZahlHow to: Convert a String to a Number