コンパイラ エラー CS1654

更新 : 2007 年 11 月

エラー メッセージ

'変数' は '読み取り専用の変数型' であるため、このメンバを変更できません。

このエラーは、特別な構造のために読み取り専用になっている変数のメンバに変更を加えようとした場合に発生します。

このエラーがよく発生する領域は、foreach ループ内部です。これは、コレクション要素の値を変更するときの、コンパイル時のエラーです。したがって、値型である要素 (構造体も含む) を変更することはできません。要素が参照型であるコレクションでは、各要素のアクセス可能なメンバを変更することはできますが、要素全体を追加や削除しようとしたり、置き換えようとしたりすると、コンパイラ エラー CS1656 が生成されます。

使用例

次の例では、Book が struct であるため、CS1654 エラーが生成されます。このエラーを解決するには、struct をクラス に変更します。

using System.Collections.Generic;
using System.Text;

namespace CS1654
{

    struct Book
    {
        public string Title;
        public string Author;
        public double Price;
        public Book(string t, string a, double p)
        {
            Title=t;
            Author=a;
            Price=p;

        }
    }

    class Program
    {
        List<Book> list;
        static void Main(string[] args)
        {
             //Use a collection initializer to initialize the list
            Program prog = new Program();
            prog.list = new List<Book>();
            prog.list.Add(new Book ("The C# Programming Language",
                                    "Hejlsberg, Wiltamuth, Golde",
                                     29.95));
            prog.list.Add(new Book ("The C++ Programming Language",
                                    "Stroustrup",
                                     29.95));
            prog.list.Add(new Book ("The C Programming Language",
                                    "Kernighan, Ritchie",
                                    29.95));
            foreach(Book b in prog.list)
            {
                //Compile error if Book is a struct
                //Make Book a class to modify its members
                b.Price +=9.95; // CS1654
            }

        }
    }
}