编译器错误 CS1656Compiler Error CS1656

无法给“variable”赋值,因为它是“只读变量类型”Cannot assign to 'variable' because it is a 'read-only variable type'

对变量赋值发生在只读上下文中时,会出现此错误。This error occurs when an assignment to variable occurs in a read-only context. 只读上下文包括 foreach 迭代变量、using 变量和 fixed 变量。Read-only contexts include foreach iteration variables, using variables, and fixed variables. 若要解决此错误,应避免给 using 块、foreach 语句和 fixed 语句中的语句变量赋值。To resolve this error, avoid assignments to a statement variable in using blocks, foreach statements, and fixed statements.

示例Example

下面的示例生成错误 CS1656,因为它尝试替换 foreach 循环内集合的全部元素。The following example generates error CS1656 because it tries to replace complete elements of a collection inside a foreach loop. 解决该错误的一种方法是将 foreach 循环更改为 for 循环。One way to work around the error is to change the foreach loop to a for loop. 另一个方法(此处未显示)是修改现有元素的成员;该方法对类可能有用,但对结构不起作用。Another way, not shown here, is to modify the members of the existing element; this is possible with classes, but not with structs.

using System;  
using System.Collections;  
using System.Collections.Generic;  
using System.Text;  
  
namespace CS1656_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")  
                    // Cannot assign to 'b' because it is a 'foreach
                    // iteration variable'  
                    b = new Book("Programming Windows, 5th Ed.", "Petzold", 29.95); //CS1656  
            }  
  
            //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);  
  
        }  
    }  
}  

示例Example

下面的示例演示如何在除 foreach 循环以外的其他上下文中生成 CS1656:The following sample demonstrates how CS1656 can be generated in other contexts besides a foreach loop:

// 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())  
        {  
            // Cannot assign to 'c' because it is a 'using variable'  
            c = new C(); // CS1656  
        }  
  
        int[] ary = new int[] { 1, 2, 3, 4 };  
        fixed (int* p = ary)  
        {  
            // Cannot assign to 'p' because it is a 'fixed variable'  
            p = null; // CS1656  
        }  
    }  
}