Ошибка компилятора CS1654
Обновлен: Ноябрь 2007
Сообщение об ошибке
Невозможно изменить члены "переменной", потому что она имеет "допускающий только чтение тип"
Cannot modify members of 'variable' because it is a 'read-only variable type'
Эта ошибка происходит при попытке изменить член переменной, предназначенной только для чтения, так как она является особой конструкцией.
Данная ошибка часто возникает в циклах foreach. При попытке изменить значения элементов коллекции происходит ошибка компиляции. Таким образом, невозможно изменить элементы, являющиеся типами значений, включая structs. В коллекции, элементы которой являются ссылочными типами, можно изменить доступные члены каждого элемента, но любая попытка добавить, удалить или заменить целый элемент приведет к возникновению Ошибка компилятора CS1656.
Пример
В следующем примере возникает ошибка CS1654, поскольку Book не является struct. Для устранения этой ошибки измените 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
}
}
}
}