Errore del compilatore CS1656
Aggiornamento: novembre 2007
Messaggio di errore
Impossibile assegnare a 'variabile' perché è di sola lettura.
Cannot assign to 'variable' because it is a 'read-only variable type'
Questo errore viene generato quando si effettua un'assegnazione a una variabile in un contesto di sola lettura. I contesti di sola lettura includono le variabili di iterazione foreach, nonché le variabili using e fixed. Per correggere l'errore, non effettuare assegnazioni a una variabile di istruzione nei blocchi using o nelle istruzioni foreach e fixed.
Esempio
Nell'esempio riportato di seguito viene generato l'errore CS1656 poiché si tenta di sostituire elementi completi di un insieme all'interno di un ciclo foreach. Per correggere l'errore, è possibile modificare il ciclo foreach in un ciclo for. Un altro modo per risolvere il problema, non illustrato in questo argomento, consiste nel modificare i membri dell'elemento esistente, un'operazione che può essere eseguita con le classi, non con le strutture.
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);
}
}
}
Nell'esempio riportato di seguito viene illustrata la generazione di CS1656 in contesti diversi da un ciclo 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
}
}
}