Kompilatorfel CS1612

Det går inte att ändra returvärdet för uttrycket eftersom det inte är en variabel

Ett försök gjordes att ändra en värdetyp som skapas som ett resultat av ett mellanliggande uttryck men som inte lagras i en variabel. Det här felet kan inträffa när du försöker ändra en struct direkt i en allmän samling, som du ser i följande exempel:

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

Om du vill ändra structen tilldelar du den först till en lokal variabel, ändrar variabeln och tilldelar sedan tillbaka variabeln till objektet i samlingen.

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

Det här felet beror på att värdetyper kopieras vid tilldelning. När du hämtar en värdetyp från en egenskap eller indexerare får du en kopia av objektet, inte en referens till själva objektet. Kopian som returneras lagras inte av egenskapen eller indexeraren eftersom de faktiskt är metoder, inte lagringsplatser (variabler). Du måste lagra kopian i en variabel som du deklarerar innan du kan ändra den.

Felet uppstår inte med referenstyper eftersom en egenskap eller indexerare i så fall returnerar en referens till ett befintligt objekt, som är en lagringsplats.

Om du definierar klassen eller structen kan du lösa det här felet genom att ändra egenskapsdeklarationen för att ge åtkomst till medlemmarna i en struct. Om du skriver klientkod kan du lösa felet genom att skapa en egen instans av structen, ändra dess fält och sedan tilldela hela structen tillbaka till egenskapen. Som ett tredje alternativ kan du ändra din struct till en klass.

Exempel

CS1612 inträffar också när du försöker komma åt medlemmen i en struct via en egenskap i en omslutande klass som returnerar hela structen, som du ser i följande exempel:

// 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();
    }  
}  

Se även