Errore del compilatore CS1654

Aggiornamento: novembre 2007

Messaggio di errore

'variabile' è una variabile 'tipo variabile di sola lettura'. Impossibile modificarne i membri.
Cannot modify members of 'variable' because it is a 'read-only variable type'

Questo errore viene generato quando si tenta di modificare i membri di una variabile di sola lettura perché inclusa in un costrutto speciale.

Un'area comune in cui si verifica questo errore è all'interno di cicli foreach. Si tratta di un errore in fase di compilazione per modificare il valore degli elementi dell'insieme. Pertanto, non è possibile apportare modifiche ad elementi che sono tipi di valore, incluse le strutture. In un insieme i cui elementi sono tipi di riferimento, è possibile modificare i membri accessibili di ogni elemento, ma qualsiasi tentativo di aggiungere, rimuovere o sostituire elementi completi genererà Errore del compilatore CS1656.

Esempio

Nell'esempio riportato di seguito viene generato l'errore CS1654 poiché Book è una struct. Per correggere l'errore, sostituire la struct con una classe.

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
            }

        }
    }
}