Compartir a través de


Error del compilador CS1654

Actualización: noviembre 2007

Mensaje de error

No se pueden modificar los miembros de 'variable' porque es 'tipo de variable de sólo lectura'
Cannot modify members of 'variable' because it is a 'read-only variable type'

Este error se produce cuando se intenta modificar miembros de una variable que es de sólo lectura por encontrarse en una construcción especial.

Un área común donde esto ocurre es dentro de los bucles foreach. Modificar el valor de los elementos de la colección constituye un error en tiempo de compilación. Por lo tanto, no puede realizarse ninguna modificación en los elementos que son tipos de valor, como las estructuras. En una colección cuyos elementos son tipos de la referencia, es posible modificar los miembros accesibles de cada elemento, pero cualquier intento de agregar, quitar o reemplazar elementos completos generará Error del compilador CS1656.

Ejemplo

El siguiente ejemplo genera el error CS1654 porque Book es una struct. Para corregir el error, cambie la struct por una clase.

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
            }

        }
    }
}