Freigeben über


Compilerfehler CS1656

Die Zuordnung von „Variable“ ist nicht möglich, da es sich um einen „schreibgeschützten Variablentyp“ handelt.

Dieser Fehler tritt auf, wenn eine Zuordnung zu einer Variable in einem schreibgeschützten Kontext vorgenommen wird. Zu den schreibgeschützten Kontexten gehören, foreach-Iterationsvariablen, using-Variablen und fixed-Variablen. Vermeiden Sie Zuordnungen zu einer Anweisungsvariable in using-Blöcken, foreach-Anweisungen und fixed-Anweisungen, um diesen Fehler zu vermeiden.

Beispiel 1

Im folgenden Beispiel wird der Fehler CS1656 generiert, da versucht wird, innerhalb einer foreach-Schleife vollständige Elemente einer Auflistung zu ersetzen. Sie können diesen Fehler umgehen, indem Sie die foreach-Schleife in eine for-Schleife ändern. Eine andere Möglichkeit, die hier nicht gezeigt wird, besteht darin, die Member des vorhandenen Elements zu ändern. Dies ist bei Klassen, jedoch nicht bei Strukturen möglich.

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);  
  
        }  
    }  
}  

Beispiel 2

Das folgende Beispiel zeigt, wie CS1656 in anderen Kontexten als einer foreach-Schleife generiert werden kann:

// 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  
        }  
    }  
}