Exportieren (0) Drucken
Alle erweitern
Erweitern Minimieren
Dieser Artikel wurde manuell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

Compilerfehler CS1656

"Variable" ist "schreibgeschützter Variablentyp", daher ist die Zuordnung nicht möglich.

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

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

        }
    }
}

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

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2015 Microsoft