Lire en anglais

Partager via


Erreur du compilateur CS1654

Impossible de modifier les membres de 'variable', car il s’agit d’un 'type_variable_lecture_seule'

Cette erreur se produit quand vous tentez de modifier les membres d’une variable qui est en lecture seule, car elle figure dans une construction spéciale.

Ce problème se produit fréquemment dans les boucles foreach . Modifier la valeur des éléments de la collection constitue une erreur de compilation. Par conséquent, vous ne pouvez pas apporter de modifications aux éléments qui sont des types valeur, notamment les structs. Dans une collection dont les éléments sont des types référence, vous pouvez modifier les membres accessibles de chaque élément, mais toute tentative d’ajout, de suppression ou de remplacement d’éléments complets génère Compiler Error CS1656.

Exemple

L’exemple suivant génère l’erreur CS1654, car Book est un struct. Pour corriger 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  
            }  
  
        }  
    }  
}