Compilerfehler CS1612Compiler Error CS1612

Der Rückgabewert von „expression“ ist keine Variable und kann daher nicht geändert werden.Cannot modify the return value of 'expression' because it is not a variable

Es wurde versucht, einen Werttyp zu ändern, der als Ergebnis eines intermediären Ausdrucks erzeugt wird, aber nicht in einer Variablen gespeichert wird.An attempt was made to modify a value type that is produced as the result of an intermediate expression but is not stored in a variable. Dieser Fehler kann auftreten, wenn Sie versuchen, eine Struktur in einer generischen Auflistung direkt zu ändern, wie im folgenden Beispiel gezeigt:This error can occur when you attempt to directly modify a struct in a generic collection, as shown in the following example:

List<myStruct> list = {…};  
list[0].Name = "MyStruct42"; //CS1612  

Um die Struktur zu ändern, weisen Sie sie zunächst einer lokalen Variable zu, ändern Sie die Variable und weisen Sie anschließend die Variable zurück auf das Element in der Auflistung.To modify the struct, first assign it to a local variable, modify the variable, then assign the variable back to the item in the collection.

List<myStruct> list = {…};  
MyStruct ms = list[0];  
ms.Name = "MyStruct42";  
list[0] = ms;  

Dieser Fehler tritt auf, weil Werttypen bei Zuweisung kopiert werden.This error occurs because value types are copied on assignment. Beim Abrufen eines Werttyps aus einer Eigenschaft oder aus einem Indexer erhalten Sie eine Kopie des Objekts, keinen Verweis auf das Objekt selbst.When you retrieve a value type from a property or indexer, you are getting a copy of the object, not a reference to the object itself. Die Kopie, die zurückgegeben wird, wird durch die Eigenschaft oder den Indexer nicht gespeichert, da es sich um Methoden und nicht um Speicherorte (Variablen) handelt.The copy that is returned is not stored by the property or indexer because they are actually methods, not storage locations (variables). Sie müssen die Kopie in einer Variablen speichern, die Sie deklarieren, bevor Sie sie ändern können.You must store the copy into a variable that you declare before you can modify it.

Der Fehler tritt nicht bei Verweistypen auf, weil eine Eigenschaft oder ein Indexer in diesem Fall einen Verweis auf ein vorhandenes Objekt zurückgibt, welches ein Speicherort ist.The error does not occur with reference types because a property or indexer in that case returns a reference to an existing object, which is a storage location.

Wenn Sie die Klasse oder Struktur definieren, können Sie diesen Fehler beheben, indem Sie Ihre Eigenschaftendeklaration für den Zugriff auf die Member einer Struktur ändern.If you are defining the class or struct, you can resolve this error by modifying your property declaration to provide access to the members of a struct. Wenn Sie Clientcode schreiben, können Sie den Fehler beheben, indem Sie eine eigene Instanz der Struktur erstellen, die Felder ändern und die gesamte Struktur anschließend wieder der Eigenschaft zuweisen.If you are writing client code, you can resolve the error by creating your own instance of the struct, modifying its fields, and then assigning the entire struct back to the property. Als dritte Alternative können Sie Ihre Struktur einer Klasse ändern.As a third alternative, you can change your struct to a class.

BeispielExample

CS1612 tritt auch auf, wenn Sie versuchen, Zugriff auf die Member einer Struktur über eine Eigenschaft einer einschließenden Klasse zu erlangen, die die gesamte Struktur zurückgibt, wie im folgenden Beispiel gezeigt:CS1612 also occurs when you attempt to access the member of a struct through a property on an enclosing class that is returning the entire struct, as shown in the following example:

// CS1612.cs  
using System;  

public struct MyStruct  
{  
    public int Width;  
}  

public class ListView  
{  
    MyStruct ms;  
    public MyStruct Size  
    {  
        get { return ms; }  
        set { ms = value; }  
    }  
}  

public class MyClass  
{  
    public MyClass()  
    {  
        ListView lvi;  
        lvi = new ListView();  
        lvi.Size.Width = 5; // CS1612  

        // You can use the following lines instead.  
        // MyStruct ms;  
        // ms.Width = 5;  
        // lvi.Size = ms;  // CS1612  
    }  

    public static void Main()   
    {  
        MyClass mc = new MyClass();  
        // Keep the console open in debug mode.  
        Console.WriteLine("Press any key to exit.");  
        Console.ReadKey();     
    }  
}  

Siehe auchSee Also

StrukturenStructs
WerttypenValue Types
VerweistypenReference Types