Przeczytaj w języku angielskim

Udostępnij za pośrednictwem


Błąd kompilatora CS1612

Nie można zmodyfikować zwracanej wartości wyrażenia, ponieważ nie jest to zmienna

Podjęto próbę zmodyfikowania typu wartości, który jest generowany w wyniku wyrażenia pośredniego, ale nie jest przechowywany w zmiennej. Ten błąd może wystąpić podczas próby bezpośredniego zmodyfikowania struktury w kolekcji ogólnej, jak pokazano w poniższym przykładzie:

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

Aby zmodyfikować strukturę, najpierw przypisz ją do zmiennej lokalnej, zmodyfikuj zmienną, a następnie przypisz zmienną z powrotem do elementu w kolekcji.

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

Ten błąd występuje, ponieważ typy wartości są kopiowane podczas przypisywania. Gdy pobierasz typ wartości z właściwości lub indeksatora, otrzymujesz kopię obiektu, a nie odwołanie do samego obiektu. Zwrócona kopia nie jest przechowywana przez właściwość lub indeksator, ponieważ są to metody, a nie lokalizacje magazynu (zmienne). Należy zapisać kopię w zmiennej zadeklarowanej przed zmodyfikowaniem.

Błąd nie występuje z typami odwołań, ponieważ właściwość lub indeksator w tym przypadku zwraca odwołanie do istniejącego obiektu, który jest lokalizacją magazynu.

Jeśli definiujesz klasę lub strukturę, możesz rozwiązać ten błąd, modyfikując deklarację właściwości w celu zapewnienia dostępu do składowych struktury. Jeśli piszesz kod klienta, możesz rozwiązać ten problem, tworząc własne wystąpienie struktury, modyfikując jego pola, a następnie przypisując całą strukturę z powrotem do właściwości. Trzecia alternatywa umożliwia zmianę struktury na klasę.

Przykład

CS1612 występuje również podczas próby uzyskania dostępu do składowej struktury za pośrednictwem właściwości w otaczającej klasie, która zwraca całą strukturę, jak pokazano w poniższym przykładzie:

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

Zobacz też