Compilerfehler CS1612

Der Rückgabewert von „expression“ ist keine Variable und kann daher nicht geändert werden.

Es wurde versucht, einen Werttyp zu ändern, der als Ergebnis eines intermediären Ausdrucks erzeugt wird, aber nicht in einer Variablen gespeichert wird. Dieser Fehler kann auftreten, wenn Sie versuchen, eine Struktur in einer generischen Auflistung direkt zu ändern, wie im folgenden Beispiel gezeigt:

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.

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

Dieser Fehler tritt auf, weil Werttypen bei Zuweisung kopiert werden. Beim Abrufen eines Werttyps aus einer Eigenschaft oder aus einem Indexer erhalten Sie eine Kopie des Objekts, keinen Verweis auf das Objekt selbst. 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. Sie müssen die Kopie in einer Variablen speichern, die Sie deklarieren, bevor Sie sie ändern können.

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.

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. 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. Als dritte Alternative können Sie Ihre Struktur einer Klasse ändern.

Beispiel

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.cs  
using System;  
  
public struct MyStruct  
{  
    public int Width;  
}  
  
public class ListView  
{  
    public MyStruct Size { get; set; }
}  
  
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;
    }  
  
    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 auch