Partager via


Erreur du compilateur CS1654

Mise à jour : novembre 2007

Message d'erreur

Impossible de modifier les membres de 'variable', car il s'agit d'un 'type de variable en lecture seule'
Cannot modify members of 'variable' because it is a 'read-only variable type'

Cette erreur se produit lorsque vous essayez de modifier des membres d'une variable qui est en lecture seule car elle se trouve dans une construction spéciale.

Cela arrive couramment dans les boucles foreach. C'est une erreur de compilation qui intervient lors de la modification de la valeur des éléments de collection. Par conséquent, vous ne pouvez pas du tout modifier des éléments qui sont des types valeur, y compris les structures. Dans une collection dont les éléments sont des types référence, vous pouvez modifier des membres accessibles de chaque élément, mais toute tentative d'ajout, de suppression ou de remplacement d'éléments complets générera Erreur du compilateur CS1656.

Exemple

L'exemple suivant génère l'erreur CS1654 parce que Book est un struct. Pour résoudre l'erreur, remplacez le struct par une 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
            }

        }
    }
}