コンパイラ エラー CS1612

変数ではないため、'<式>' の戻り値を変更できません

中間式の結果として生成され、変数には格納されない値型を変更しようとしました。 このエラーは、ジェネリック コレクション内の構造体を直接変更しようとしたときに発生する可能性があります。例を次に示します。

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

構造体を変更するには、まず構造体をローカル変数に割り当て、変数を変更します。その後、コレクションの項目に変数を代入して戻します。

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

このエラーは、値型が代入時にコピーされるために発生します。 プロパティやインデクサーから値型を取得する場合は、オブジェクト自体への参照ではなく、そのオブジェクトのコピーを取得することになります。 返されたコピーは、プロパティやインデクサーには格納されていません。これは、プロパティやインデクサーが格納場所 (変数) ではなく、実際はメソッドであるためです。 このコピーを変更するには、ユーザーが宣言した変数にコピーを格納する必要があります。

参照型の場合は、プロパティやインデクサーから既存のオブジェクトへの参照 (格納場所) が返されるため、このエラーは発生しません。

クラスまたは構造体を定義している場合は、プロパティ宣言を変更して構造体のメンバーにアクセスできるようにすることで、このエラーを解決できます。 クライアント コードを記述している場合にエラーを解決するには、構造体の独自のインスタンスを作成し、そのフィールドを変更してから、構造体全体をプロパティに再度代入します。 第 3 の方法として、構造体をクラスに変更することもできます。

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

関連項目