コンパイラ エラー CS1612Compiler Error CS1612

変数ではないため、'<式>' の戻り値を変更できませんCannot modify the return value of 'expression' because it is not a variable

中間式の結果として生成され、変数には格納されない値型を変更しようとしました。An attempt was made to modify a value type that is produced as the result of an intermediate expression but is not stored in a variable. このエラーは、ジェネリック コレクション内の構造体を直接変更しようとしたときに発生する可能性があります。例を次に示します。This error can occur when you attempt to directly modify a struct in a generic collection, as shown in the following example:

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

構造体を変更するには、まず構造体をローカル変数に割り当て、変数を変更します。その後、コレクションの項目に変数を代入して戻します。To modify the struct, first assign it to a local variable, modify the variable, then assign the variable back to the item in the collection.

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

このエラーは、値型が代入時にコピーされるために発生します。This error occurs because value types are copied on assignment. プロパティやインデクサーから値型を取得する場合は、オブジェクト自体への参照ではなく、そのオブジェクトのコピーを取得することになります。When you retrieve a value type from a property or indexer, you are getting a copy of the object, not a reference to the object itself. 返されたコピーは、プロパティやインデクサーには格納されていません。これは、プロパティやインデクサーが格納場所 (変数) ではなく、実際はメソッドであるためです。The copy that is returned is not stored by the property or indexer because they are actually methods, not storage locations (variables). このコピーを変更するには、ユーザーが宣言した変数にコピーを格納する必要があります。You must store the copy into a variable that you declare before you can modify it.

参照型の場合は、プロパティやインデクサーから既存のオブジェクトへの参照 (格納場所) が返されるため、このエラーは発生しません。The error does not occur with reference types because a property or indexer in that case returns a reference to an existing object, which is a storage location.

クラスまたは構造体を定義している場合は、プロパティ宣言を変更して構造体のメンバーにアクセスできるようにすることで、このエラーを解決できます。If you are defining the class or struct, you can resolve this error by modifying your property declaration to provide access to the members of a struct. クライアント コードを記述している場合にエラーを解決するには、構造体の独自のインスタンスを作成し、そのフィールドを変更してから、構造体全体をプロパティに再度代入します。If you are writing client code, you can resolve the error by creating your own instance of the struct, modifying its fields, and then assigning the entire struct back to the property. 第 3 の方法として、構造体をクラスに変更することもできます。As a third alternative, you can change your struct to a class.

Example

CS1612 エラーは、構造体全体を返す外側のクラスのプロパティを通じて、構造体のメンバーにアクセスしようとしたときにも発生します。例を次に示します。CS1612 also occurs when you attempt to access the member of a struct through a property on an enclosing class that is returning the entire struct, as shown in the following example:

// CS1612.cs  
using System;  

public struct MyStruct  
{  
    public int Width;  
}  

public class ListView  
{  
    MyStruct ms;  
    public MyStruct Size  
    {  
        get { return ms; }  
        set { ms = value; }  
    }  
}  

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;  // CS1612  
    }  

    public static void Main()   
    {  
        MyClass mc = new MyClass();  
        // Keep the console open in debug mode.  
        Console.WriteLine("Press any key to exit.");  
        Console.ReadKey();     
    }  
}  

参照See Also

構造体Structs
値型Value Types
参照型Reference Types