Partager via


Erreur du compilateur CS1656

Mise à jour : novembre 2007

Message d'erreur

Impossible d'assigner à 'variable', car il s'agit d'un 'type de variable en lecture seule'
Cannot assign to 'variable' because it is a 'read-only variable type'

Cette erreur se produit lorsqu'une assignation à une variable a lieu dans un contexte en lecture seule. Les contextes en lecture seule incluent des variables d'itération foreach, ainsi que des variables using et fixed. Pour résoudre cette erreur, évitez les assignations à une variable d'instruction dans les blocs using et dans les instructions foreach et fixed.

Exemple

L'exemple suivant génère l'erreur CS1656 parce qu'il essaie de remplacer des éléments complets d'une collection à l'intérieur d'une boucle foreach. L'une des façons de contourner cette erreur consiste à remplacer la boucle foreach par une boucle for. Une autre façon, non illustrée ici, consiste à modifier les membres de l'élément existant; ce qui est possible avec les classes, mais pas avec les structs.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace CS1654_2
{

    class 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
    {
        private List<Book> list;
        static void Main(string[] args)
        {
            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)
            {
                // Cannot modify an entire element in a foreach loop 
                // even with reference types.
                // Use a for or while loop instead
                if(b.Title == "The C Programming Language")
                    b = new Book("Programming Windows, 5th Ed.", "Petzold", 29.95); //CS1654
            }

            //With a for loop you can modify elements
            //for(int x = 0; x < prog.list.Count; x++)
            //{
            //    if(prog.list[x].Title== "The C Programming Language")
            //        prog.list[x] = new Book("Programming Windows, 5th Ed.", "Petzold", 29.95);
            //}
            //foreach(Book b in prog.list)
            //    Console.WriteLine(b.Title);

        }
    }
}

L'exemple suivant montre comment l'erreur CS1656 peut être générée dans d'autres contextes que la boucle foreach :

// CS1656.cs
// compile with: /unsafe
using System;

class C : IDisposable
{
    public void Dispose() { }
}

class CMain
{
    unsafe public static void Main()
    {
        using (C c = new C())
        {
            c = new C(); // CS1656
        }

        int[] ary = new int[] { 1, 2, 3, 4 };
        fixed (int* p = ary)
        {
            p = null; // CS1656
        }
    }
}