Compilerfehler CS0029Compiler Error CS0029

Kann den Typ „type“ nicht implizit in „type“ konvertierenCannot implicitly convert type 'type' to 'type'

Der Compiler erfordert eine explizite Konvertierung.The compiler requires an explicit conversion. Sie müssen z.B. einen r-Wert in den gleichen Typ wie einen l-Wert umwandeln.For example, you may need to cast an r-value to be the same type as an l-value. Oder Sie müssen zur Unterstützung bestimmter Operatorüberladungen Konvertierungsroutinen angeben.Or, you must provide conversion routines to support certain operator overloads.

Sie müssen Konvertierungen durchführen, wenn Sie eine Variablen eines Typs einer Variablen eines andere Typs zuweisen.Conversions must occur when assigning a variable of one type to a variable of a different type. Wenn Sie eine Zuweisung zwischen Variablen verschiedener Typen durchführen, muss der Compiler den Typ der rechten Seite des Zuweisungsoperator in den Typ der linken Seite des Zuweisungsoperators konvertieren.When making an assignment between variables of different types, the compiler must convert the type on the right-hand side of the assignment operator to the type on the left-hand side of the assignment operator. Nehmen Sie z.B. den folgenden Code:Take the following the code:

int i = 50;  
long lng = 100;  
i = lng;  

i = lng; führt eine Zuweisung durch, aber die Datentypen der Variablen auf der linken und der rechten Seite des Zuweisungsoperators stimmen nicht überein.i = lng; makes an assignment, but the data types of the variables on the left and right-hand side of the assignment operator don't match. Vor der Zuweisung konvertiert der Compiler implizit die Variable lng, die vom Typ „long“ ist, in den Typ „int“. Dies geschieht implizit, da kein Code den Compiler explizit angewiesen hat, diese Konvertierung durchzuführen.Before making the assignment the compiler is implicitly converting the variable lng, which is of type long, to an int. This is implicit because no code explicitly instructed the compiler to perform this conversion. Das Problematische an diesem Code ist, dass dies als einschränkende Konvertierung angesehen, und der Compiler lässt keine einschränkenden Konvertierungen zu, da diese zu Datenverlusten führen könnte.The problem with this code is that this is considered a narrowing conversion, and the compiler does not allow implicit narrowing conversions because there could be a potential loss of data.

Eine einschränkende Konvertierung besteht, wenn Sie in einen Datentyp konvertieren, der weniger Speicherplatz im Arbeitsspeicher in Anspruch nimmt als der Datentyp, der konvertiert wird.A narrowing conversion exists when converting to a data type that occupies less storage space in memory than the data type we are converting from. Wenn Sie z.B. den Typ „long“ in den Typ „int“ konvertieren, wird dies als einschränkende Konvertierung angesehen.For example, converting a long to an int would be considered a narrowing conversion. Der Typ „long“ nimmt 8 Byte Arbeitsspeicher in Anspruch, während ein Typ „int“ nur 4 Byte in Anspruch nimmt.A long occupies 8 bytes of memory while an int occupies 4 bytes. Um zu sehen, wie es zu Datenverlust kommen kann, schauen Sie sich das folgende Beispiel an:To see how data loss can occur, consider the following sample:

int i = 50;  
long lng = 3147483647;  
i = lng;  

Die Variable lng enthält nun einen Wert, der nicht in der Variable i gespeichert werden kann, da er zu groß ist.The variable lng now contains a value that cannot be stored in the variable i because it is too large. Wenn Sie nun diesen Wert in den Typ „int“ konvertieren würden, würden Sie einige Ihrer Daten verlieren, und der konvertierte Wert wäre nicht der gleiche wie vor der Konvertierung.If we were to convert this value to an int type we would be losing some of our data and the converted value would not be the same as the value before the conversion.

Eine erweiternde Konvertierung ist das Gegenteil einer einschränkenden Konvertierung.A widening conversion would be the opposite of a narrowing conversion. Bei erweiternden Konvertierungen wird eine Konvertierung in einen Datentyp durchgeführt, der mehr Platz in Anspruch nimmt als der Typ, der konvertiert wird.With widening conversions, we are converting to a data type that occupies more storage space in memory than the data type we are converting from. Dies ist ein Beispiel für eine erweiternde Konvertierung:Here is an example of a widening conversion:

int i = 50;  
long lng = 100;  
lng = i;  

Beachten Sie den Unterschied zwischen diesem und dem ersten Codebeispiel.Notice the difference between this code sample and the first. Dieses Mal befindet sich die Variable lng auf der rechten Seite des Zuweisungsoperators, sodass Sie das Ziel der Zuweisung darstellt.This time the variable lng is on the left-hand side of the assignment operator, so it is the target of our assignment. Vor der Zuweisung muss der Compiler die Variable i des Typ „int“ implizit in den Typ „long“ konvertieren.Before the assignment can be made, the compiler must implicitly convert the variable i, which is of type int, to type long. Dabei handelt es sich um eine erweiternde Konvertierung, da Sie einen Typ, der 4 Byte in Anspruch nimmt (int), in einen Typ, der 8 Byte in Anspruch nimmt (long), konvertieren.This is a widening conversion since we are converting from a type that occupies 4 bytes of memory (an int) to a type that occupies 8 bytes of memory (a long). Implizite erweiternde Konvertierungen sind zulässig, da es dabei nicht zu Datenverlusten kommen kann.Implicit widening conversions are allowed because there is no potential loss of data. Jeder Wert, der in einem int-Typ gespeichert werden kann, kann auch in einem long-Typ gespeichert werden.Any value that can be stored in an int can also be stored in a long.

Sie wissen, dass implizite einschränkende Konvertierungen nicht zulässig sind. Deshalb müssen Sie den Datentyp explizit konvertieren, um diesen Code kompilieren zu können.We know that implicit narrowing conversions are not allowed, so to be able to compile this code we need to explicitly convert the data type. Explizite Konvertierungen erfolgen durch eine Umwandlung.Explicit conversions are done using casting. Umwandlung ist der in C# verwendete Begriff für die Konvertierung eines Datentyps in einen anderen.Casting is the term used in C# to describe converting one data type to another. Damit der Code kompiliert, müssen Sie folgende Syntax verwenden.To get the code to compile we would need to use the following syntax:

int i = 50;  
long lng = 100;  
i = (int) lng;   // cast to int  

Die dritte Codezeile weist den Compiler an, die Variable lng des Typs „long“ vor der Zuweisung explizit in den Typ „long“ zu konvertieren.The third line of code tells the compiler to explicitly convert the variable lng, which is of type long, to an int before making the assignment. Denken Sie daran, dass es bei einer einschränkenden Konvertierung zu Datenverlusten kommen kann.Remember that with a narrowing conversion, there is a potential loss of data. Einschränkende Konvertierungen sollten mit Vorsicht eingesetzt werden, und auch wenn der Code kompiliert, erhalten Sie möglicherweise zur Laufzeit unerwartete Ergebnisse.Narrowing conversions should be used with caution and even though the code will compile you may get unexpected results at run-time.

Dies bezieht sich nur auf Werttypen.This discussion has only been for value types. Wenn Sie mit Werttypen arbeiten, arbeiten Sie mit Daten, die direkt in der Variablen gespeichert sind.When working with value types you work directly with the data stored in the variable. .NET Framework hat aber auch Verweistypen.However, the .NET Framework also has reference types. Wenn Sie mit Verweistypen arbeiten, arbeiten Sie mit einem Verweis auf eine Variable und nicht mit den tatsächlichen Daten.When working with reference types you are working with a reference to a variable, not the actual data. Beispiele für Verweistypen sind Klassen, Schnittstellen und Arrays.Examples of reference types would be classes, interfaces and arrays. Sie können einen Verweistyp weder explizit noch implizit in einen anderen konvertieren, es sei denn, der Compiler lässt die spezifische Konvertierung zu, oder die entsprechenden Konvertierungsoperatoren sind implementiert.You cannot implicitly or explicitly convert one reference type to another unless the compiler allows the specific conversion or the appropriate conversion operators are implemented.

Im folgenden Beispiel wird CS0029 generiert:The following sample generates CS0029:

// CS0029.cs  
public class MyInt  
{  
    private int x = 0;      

    // Uncomment this conversion routine to resolve CS0029  
    /*  
    public static implicit operator int(MyInt i)  
    {  
       return i.x;  
    }  
    */  

    public static void Main()  
   {  
      MyInt myInt = new MyInt();  
      int i = myInt; // CS0029  
   }  
}  

Siehe auchSee Also

KonvertierungsoperatorenConversion Operators