Прочитать на английском

Поделиться через


Ошибка компилятора CS1654

Невозможно изменить члены переменной "переменная", так как она имеет тип "тип переменной только для чтения"

Эта ошибка возникает при попытке изменить члены переменной, которая доступна только для чтения, так как находится в специальной конструкции.

Чаще всего это происходит в циклах foreach . Это ошибка времени компиляции для изменения значения элементов коллекции. Поэтому невозможно вносить изменения в элементы, которые являются типами значений, включая структуры. В коллекции, элементы которой являются ссылочными типами, вы можете изменять доступные члены каждого элемента, но любая попытка добавить, удалить или заменить элемент целиком приведет к ошибке Compiler Error CS1656.

Пример

В следующем примере возникает ошибка CS1654, поскольку Book является struct. Чтобы устранить эту ошибку, измените struct на class.

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  
            }  
  
        }  
    }  
}