Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel werden die folgenden Compilerfehler behandelt:
- CS0193: Der * oder -> Operator muss auf einen Datenzeiger angewendet werden.
- CS0196: Ein Zeiger muss nur mit einem Wert indiziert werden.
- CS0208: Kann die Adresse nicht annehmen, die Größe abrufen oder einen Zeiger auf einen verwalteten Typ deklarieren ('Typ')
- CS0209: Der lokale Typ, der in einer festen Anweisung deklariert ist, muss ein Zeigertyp sein.
-
CS0210: Sie müssen einen Initialisierer in einer fixed- oder
using-Deklaration angeben. - CS0211: Die Adresse des angegebenen Ausdrucks kann nicht abgerufen werden.
- CS0212: Sie können nur die Adresse eines nicht korrigierten Ausdrucks innerhalb eines festen Anweisungsinitialisierungsprogramms verwenden.
- CS0213: Sie können die feste Anweisung nicht verwenden, um die Adresse eines bereits festen Ausdrucks zu übernehmen.
- CS0214: Zeiger und Puffer mit fester Größe können nur in unsicherem Kontext verwendet werden.
- CS0227: Unsicherer Code kann nur angezeigt werden, wenn die Kompilierung mit /unsafe erfolgt.
- CS0233: "Identifier" hat keine vordefinierte Größe, daher kann sizeof nur in einem unsicheren Kontext verwendet werden.
- CS0242: Der fragliche Vorgang ist für leere Zeiger nicht definiert.
-
CS0244: Weder '
is' noch 'as' ist für Zeigertypen gültig - CS0254: Die rechte Seite einer festen Anweisung darf kein Umwandlungsausdruck sein.
- CS0459: Die Adresse einer schreibgeschützten lokalen Variablen kann nicht ermittelt werden.
- CS0821: Implizit typisierte lokale Variablen können nicht fixiert werden.
- CS1641: Ein Pufferfeld mit fester Größe muss den Arraygrößenbezeichner nach dem Feldnamen aufweisen.
- CS1642: Pufferfelder mit fester Größe dürfen nur Elemente von Strukturen sein.
- CS1656: 'Variable' kann nicht zugewiesen werden, da es sich um einen schreibgeschützten Variablentyp handelt.
-
CS1663: Der Puffertyp mit fester Größe muss einer der folgenden sein:
bool,byte,short,int,long,char,sbyte,ushort,uint,ulong,floatoderdouble - CS1665: Puffer mit fester Größe müssen eine Länge größer als 0 haben.
- CS1666: Sie können keine Puffer mit fester Größe verwenden, die in nicht behobenen Ausdrücken enthalten sind. Versuchen Sie, die feste Anweisung zu verwenden.
- CS1708: Auf Puffer mit fester Größe kann nur über Lokale oder Felder zugegriffen werden.
-
CS1716: Verwenden Sie nicht das Attribut "
System.Runtime.CompilerServices.FixedBuffer". Verwenden Sie stattdessen den Feldmodifizierer "fixed". - CS1919: Unsicherer Typ "Typname" kann nicht in der Objekterstellung verwendet werden.
-
CS4004: In einem unsicheren Kontext nicht
awaitmöglich -
CS8812: Gruppe kann nicht in einen nicht funktionsfreien Zeigertyp konvertiert
&Methodwerden. -
CS9123: Der Operator "
&" sollte nicht für Parameter oder lokale Variablen in asynchronen Methoden verwendet werden.
Zeigeroperationen und Dereferenzierung
-
CS0193: Der
*oder->-Operator muss auf einen Datenzeiger angewendet werden. - CS0196: Ein Zeiger muss nur mit einem Wert indiziert werden.
- CS0242: Der fragliche Vorgang ist für leere Zeiger nicht definiert.
Um Zeigervorgänge richtig zu verwenden, befolgen Sie die Regeln für die Ableitung, Indizierung und arithmetische Vorgänge. Weitere Informationen finden Sie unter Zeigertypen und Funktionszeiger.
- Wenden Sie den
*- oder->-Operator nur auf Datenzeiger (CS0193) an. Verwenden Sie diese Operatoren nicht mit Nichtpointertypen oder Funktionszeigern. Funktionszeiger können in C# nicht abgeleitet werden, anders als in C/C++. - Indexzeiger mit nur einem Wert (CS0196). Die mehrdimensionale Indizierung wird für Zeiger nicht unterstützt.
- Vermeiden Sie Vorgänge, die für leere Zeiger (CS0242) nicht definiert sind. Erhöhen Sie z. B. keinen leeren Zeiger, da der Compiler nicht die Größe der Daten kennt, auf die verwiesen wird.
Zeigertypen und verwaltete Typen
- CS0208: Kann die Adresse nicht annehmen, die Größe abrufen oder einen Zeiger auf einen verwalteten Typ deklarieren ('Typ')
- CS0233: "Identifier" hat keine vordefinierte Größe, daher kann sizeof nur in einem unsicheren Kontext verwendet werden.
Verwenden Sie nicht verwaltete Typen und ordnungsgemäße Kontexte, um mit Zeigern und dem sizeof Operator ordnungsgemäß zu arbeiten. Weitere Informationen finden Sie unter "Nicht verwaltete Typen " und " sizeof Operator".
- Verwenden Sie Zeiger nur für nicht verwaltete Typen (CS0208). Nehmen Sie nicht die Adresse von, ermitteln Sie nicht die Größe von, oder deklarieren Sie keine Zeiger auf verwaltete Typen. Verwaltete Typen umfassen Referenztypen und -strukturen, die Referenztypfelder oder -eigenschaften enthalten.
- Verwenden Sie den
sizeofOperator innerhalb einesunsafeKontexts, wenn Sie mit Typen arbeiten, deren Größe keine Kompilierungszeitkonstante (CS0233) ist.
Feste Puffer
- CS0209: Der lokale Typ, der in einer festen Anweisung deklariert ist, muss ein Zeigertyp sein.
-
CS0210: Sie müssen in einer festen Deklaration oder
using-Anweisung einen Initialisierer angeben. - CS0211: Die Adresse des angegebenen Ausdrucks kann nicht abgerufen werden.
- CS0212: Sie können die Adresse eines nicht fixierten Ausdrucks nur innerhalb eines festen Anweisungsinitialisierers verwenden.
- CS0213: Sie können die fixed-Anweisung nicht verwenden, um die Adresse eines bereits fixierten Ausdrucks zu ermitteln.
- CS0254: Die rechte Seite einer fixed-Anweisung darf kein Cast-Ausdruck sein.
- CS0459: Kann die Adresse einer schreibgeschützten lokalen Variablen nicht nehmen.
- CS0821: Implizit typisierte Variablen können nicht festgelegt werden.
- CS1656: 'Variable' kann nicht zugewiesen werden, da es sich um einen schreibgeschützten Variablentyp handelt.
Diese Fehler treten auf, wenn Sie die fixed Anweisung falsch verwenden. Die fixed Anweisung verhindert, dass der Garbage Collector eine verschiebbare Variable versetzt, und deklariert einen Zeiger auf diese Variable. Weitere Informationen finden Sie unter "Unsicherer Code und Zeiger".
So verwenden Sie die fixed Anweisung richtig:
- Deklarieren Sie die Variable als Zeigertyp (CS0209).
- Stellen Sie einen Initialisierer in der
fixed-Anweisungsdeklaration bereit (CS0210). - Verwenden Sie die Adresse nur gültiger Ausdrücke: Felder, lokale Variablen und Zeigerindirektion (CS0211). Nehmen Sie nicht die Adresse von berechneten Ausdrücken, wie zum Beispiel der Summe zweier Variablen.
- Verwenden Sie den Adressoperator bei nicht fixierten Ausdrücken nur innerhalb des
fixedAnweisungsinitialisierers (CS0212). - Verwenden Sie keine
fixed-Anweisung für bereits behobene Ausdrücke (CS0213). Lokale Variablen und Parameter in einerunsafeMethode sind bereits im Stack behoben. - Verwenden Sie keine Umwandlungsausdrücke auf der rechten Seite einer
fixedAnweisungszuweisung (CS0254). - Verwenden Sie nicht die Adresse von schreibgeschützten lokalen Variablen (CS0459). Variablen in
foreachSchleifen,usingAnweisungen undfixedAnweisungen sind nur lesbar. - Verwenden Sie explizite Typen anstelle von
varinfixed-Anweisungen (CS0821). - Weisen Sie in schreibgeschützten Kontexten wie
foreachSchleifen,usingBefehlen oderfixedBefehlen (CS1656) keine Variablen zu.
Unsichere Kontexteinschränkungen
- CS0214: Zeiger und Puffer mit fester Größe können nur in unsicherem Kontext verwendet werden.
- CS0227: Unsicherer Code kann nur angezeigt werden, wenn die Kompilierung mit /unsafe erfolgt.
- CS0244: Weder 'is' noch 'as' ist für Zeigertypen gültig
- CS1919: Unsicherer Typ "Typname" kann in der Objekterstellung nicht verwendet werden.
- CS4004: Kann nicht auf ein Ergebnis in einem unsicheren Kontext warten
- CS9123: Der Operator "&" sollte nicht für Parameter oder lokale Variablen in asynchronen Methoden verwendet werden.
Diese Fehler treten auf, wenn Sie unsichere Codekonstrukte ohne ordnungsgemäßen unsicheren Kontext verwenden oder wenn Sie Vorgänge versuchen, die im unsicheren Code nicht zulässig sind. Weitere Informationen finden Sie unter "Unsicherer Code und Zeiger" und das unsafe Schlüsselwort.
So verwenden Sie unsicheren Code richtig:
- Markieren Sie Methoden, Typen oder Codeblöcke, die Zeiger oder Puffer mit fester Größe mit dem
unsafeSchlüsselwort (CS0214) verwenden. - Aktivieren Sie die Compileroption AllowUnsafeBlocks in Ihren Projekteinstellungen, wenn Sie das
unsafeSchlüsselwort (CS0227) verwenden. - Verwenden Sie die
isasOperatoren nicht mit Zeigertypen (CS0244). Diese Typtestoperatoren sind für Zeiger nicht gültig. - Verwenden Sie den
newOperator nicht zum Erstellen von Zeigertypinstanzen (CS1919). Um Objekte im nicht verwalteten Speicher zu erstellen, verwenden Sie Interop, um systemeigene Methoden aufzurufen, die Zeiger zurückgeben. - Schützen Sie unsicheren Code getrennt von asynchronem Code (CS4004). Erstellen Sie separate Methoden für unsichere Vorgänge, und rufen Sie sie von asynchronen Methoden auf.
- Verwenden Sie die Adresse des Operators (
&) nicht für Parameter oder lokale Variablen in asynchronen Methoden (CS9123). Die Variable ist möglicherweise nicht vorhanden, wenn der asynchrone Vorgang abgeschlossen ist.
Puffer fester Größe
- CS1641: Ein Pufferfeld mit fester Größe muss den Arraygrößenbezeichner nach dem Feldnamen aufweisen.
- CS1642: Pufferfelder mit fester Größe dürfen nur Elemente von Strukturen sein.
- CS1663: Der Puffertyp mit fester Größe muss einen der folgenden Werte aufweisen: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float oder double
- CS1665: Puffer mit fester Größe müssen eine Länge größer als 0 haben.
- CS1666: Sie können keine Puffer mit fester Größe verwenden, die in nicht behobenen Ausdrücken enthalten sind. Versuchen Sie, die feste Anweisung zu verwenden.
- CS1708: Auf Puffer mit fester Größe kann nur über Lokale oder Felder zugegriffen werden.
- CS1716: Verwenden Sie nicht das Attribut "System.Runtime.CompilerServices.FixedBuffer". Verwenden Sie stattdessen den "festen" Feldmodifizierer.
Diese Fehler treten auf, wenn Sie mit Puffern mit fester Größe arbeiten. Puffer mit fester Größe sind Arrays, die direkt in Strukturen eingebettet sind und in erster Linie für Interoperabilitätsszenarien verwendet werden. Weitere Informationen finden Sie unter Puffer mit fester Größe.
So deklarieren und verwenden Sie Puffer mit fester Größe richtig:
- Geben Sie die Arraygröße nach dem Feldnamen mithilfe einer positiven ganzzahligen Konstante an (CS1641, CS1665).
- Deklarieren Sie Puffer mit fester Größe nur in Anweisungen, nicht in Klassen (CS1642). Verwenden Sie ein normales Array, wenn Sie das Feld in einer Klasse benötigen.
- Verwenden Sie einen der unterstützten Elementtypen:
bool, , ,byteshort,int,long, ,charsbyte,ushort, ,uintulong, , , oderfloatdouble(CS1663). - Verwenden Sie eine
fixedAnweisung, um die enthaltende Struktur anzuheften, bevor Sie auf den Puffer zugreifen (CS1666). - Zugriff auf Puffer mit fester Größe nur über Lokale oder Felder, nicht über Zwischenausdrücke (CS1708).
- Verwenden Sie den
fixedFeldmodifizierer anstelle desSystem.Runtime.CompilerServices.FixedBufferAttributs (CS1716).
Funktionszeiger
-
CS8812: Gruppe kann nicht in einen nicht funktionsfreien Zeigertyp konvertiert
&Methodwerden.
Verwenden Sie zum Abrufen eines Funktionszeigers die Adresse des Operators mit einem expliziten Funktionszeigertyp cast. Verwenden Sie den Adressoperator & nicht, um Methodengruppen void* oder andere Nicht-Funktionszeigertypen zuzuweisen. Weitere Informationen finden Sie unter Funktionszeiger.