編譯器錯誤 CS1612

無法修改 'expression' 的傳回值,因為它不是變數

嘗試修改因中繼運算式而產生但未儲存在變數中的實值型別。 當您嘗試直接修改泛型集合中的結構時發生此錯誤,如下列範例所示︰

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

若要修改結構,請先將它指派給區域變數,並修改變數,然後將變數指派回集合中的項目。

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

因為指派時複製實值型別,所以發生此錯誤。 當您從屬性或索引子擷取實值型別時,會收到物件的複本,而不是物件本身的參考。 屬性或索引子不會儲存所傳回的複本,因為它們實際上是方法,而不是儲存位置 (變數)。 您必須先將該複本儲存至所宣告的變數,才能進行修改。

參考類型未發生錯誤,因為在該情況下的屬性或索引子會傳回現有物件的參考,即儲存位置。

如果您要定義類別或結構,則修改屬性宣告以提供結構成員存取權,即可解決這個錯誤。 如果您要撰寫用戶端程式碼,則建立專屬結構執行個體,並修改其欄位,然後將整個結構指派回屬性,即可解決錯誤。 第三個替代方式是您可以將結構變更為類別。

範例

嘗試透過要傳回整個結構之封入類別上的屬性來存取結構成員時,也會發生 CS1612,如下列範例所示:

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

另請參閱