Fehler und Warnungen im Zusammenhang mit Verweisparametern, Variablen und Rückgaben

Die folgenden Fehler können generiert werden, wenn Sie mit Verweisvariablen arbeiten:

  • CS0192: Ein readonly-Feld kann nicht als ein ref- oder out-Wert verwendet werden (außer in einem Konstruktor)
  • CS0199: Ein static readonly-Feld kann nicht als ein ref- oder out-Wert verwendet werden (außer in einem statischen Konstruktor)
  • CS0206: Eine Eigenschaft oder ein Indexer, der nichts zurückgibt, kann nicht als ein out- oder ref-Wert verwendet werden
  • CS0631: ref und out sind in diesem Kontext ungültig
  • CS0767: Eine Schnittstelle mit den angegebenen Typparametern kann nicht geerbt werden, da die Methode Überladungen enthält, die sich nur bei ref und out unterscheiden
  • CS1510: Ein ref- oder out-Wert muss eine zuzuweisende Variable sein
  • CS1605: Variable kann nicht als ref- oder out-Wert verwendet werden, da sie schreibgeschützt ist
  • CS1623: Iteratoren können nicht ref-, in- oder out-Parameter haben
  • CS1649: Elemente eines readonly-Felds können nicht als ein ref- oder out-Wert verwendet werden (außer in einem Konstruktor)
  • CS1651: Felder eines statischen schreibgeschützten Felds können nicht als ref- oder out-Wert verwendet werden (außer in einem statischen Konstruktor)
  • CS1655: Felder vom Typ können nicht als ref- oder out-Wert verwendet werden
  • CS1657: Variable kann nicht als ref- oder out-Wert verwendet werden
  • CS1741: Ein ref- oder out-Parameter darf keinen Standardwert haben
  • CS1939: Die Bereichsvariable kann nicht als out oder ref-Parameter übergeben werden
  • CS1988: Async-Methoden können keine ref-, in- oder out-Parameter haben
  • CS7084: Ein Windows-Runtime-Ereignis wird möglicherweise nicht als out- oder ref-Parameter übergeben.
  • CS8166: Kann einen Parameter nicht durch Verweis zurückgeben, da es sich nicht um einen ref-Parameter handelt
  • CS8167: Kann nicht zurückgegeben werden, indem auf ein Element des Parameters verwiesen wird, da es sich nicht um einen ref- oder out-Parameter handelt
  • CS8168: Kann nicht lokal durch Verweis zurückgegeben werden, da es sich nicht um einen lokalen Verweis handelt
  • CS8169: Kann ein Element der lokalen Variablen nicht durch Verweis zurückgeben, da es sich nicht um einen lokalen Verweis handelt
  • CS8196: Ein Verweis auf eine implizit typisierte out-Variable ist in der gleichen Argumentliste unzulässig.
  • CS8325: 'await' kann nicht in einem Ausdruck verwendet werden, der einen ref bedingten Operator enthält
  • CS8326: Entweder müssen beide Bedingungsoperatorwerte Bezugswerte sein, oder keiner von beiden
  • CS8327: Der Ausdruck muss vom richtigen Typ sein, um dem alternativen Bezugswert zu entsprechen
  • CS8329: Variable kann nicht als ref- oder out-Wert verwendet werden, da es sich um eine schreibgeschützte Variable handelt
  • CS8330: Elemente der Variablen können nicht als ref- oder out-Wert verwendet werden, da es sich um schreibgeschützte Variablen handelt
  • CS8331: Kann Variablen nicht zuweisen oder als rechte Seite einer ref-Zuordnung verwenden, da es sich um schreibgeschützte Variablen handelt
  • CS8332: Kann einem Element der Variablen nicht zugewiesen oder als rechte Seite einer ref-Zuordnung verwendet werden, da es sich um eine schreibgeschützte Variable handelt
  • CS8337: Der erste Parameter einer Erweiterungsmethode „ref“ muss ein Werttyp oder ein generischer Typ sein, der auf eine Struktur beschränkt ist.
  • CS8338: Der erste „in“- oder „ref readonly“-Parameter der Erweiterungsmethode muss ein konkreter (nicht generischer) Werttyp sein.
  • CS8345: Feld- oder automatisch implementierte Eigenschaft darf nicht vom Typ sein, es sei denn, es handelt sich um ein Instanzmember einer ref struct.
  • CS8351: Verzweigungen eines ref bedingten Operators können nicht auf Variablen mit inkompatiblen Deklarationsbereichen verweisen
  • CS8373: Die linke Seite einer ref-Zuordnung muss eine Verweisvariable sein.
  • CS8374: Die Quelle für die Zuweisung kann nicht über einen schmaleren Escapebereich als das Ziel verfügen.
  • CS8388: Eine out-Variable kann nicht als lokaler Verweis deklariert werden
  • CS8977: Kann nicht „ref“, „in“ oder „out“ in der Signatur einer Methode verwenden, die mit „UnmanagedCallersOnly“ zugeschrieben wird.
  • CS9072: Eine Dekonstruktionsvariable kann nicht als lokaler Verweis deklariert werden
  • CS9077: Kann einen Parameter nicht durch Verweis über einen ref-Parameter zurückgeben. Er kann nur in einer Rückgabe-Anweisung zurückgegeben werden
  • CS9078: Kann nicht zurückgegeben werden, indem auf ein Element des Parameters über einen ref-Parameter verwiesen wird. Er kann nur in einer Rückgabe-Anweisung zurückgegeben werden
  • CS9079: Kann keine Zuweisung durchführen, da die Quelle der aktuellen Methode nur über eine Rückgabe-Anweisung escapen kann.
  • CS9096: Die Zuweisung kann nicht zurückgestellt werden, da die Quelle einen breiteren Wertescapebereich aufweist als das Ziel, sodass die Zuordnung über die Quelle von Werten mit schmaleren Escapebereichen als das Ziel zulässig ist.
  • CS9101: UnscopedRefAttribute kann nur auf Strukturinstanzmethoden und -eigenschaften angewendet werden und kann nicht auf Konstruktoren oder init-only-Member angewendet werden.
  • CS9102: UnscopedRefAttribute kann nicht auf eine Schnittstellenimplementierung angewendet werden.
  • CS9104: Eine using-Anweisungsressource vom Typ kann nicht in asynchronen Methoden oder asynchronen Lambda-Ausdrücken verwendet werden.
  • CS9190: readonly-Modifizierer muss nach refangegeben werden.
  • CS9199: Ein ref readonly-Parameter darf nicht über das Attribut „Out“ verfügen.

Die folgenden Warnungen werden generiert, wenn Verweisvariablen falsch verwendet werden:

  • CS9085: Dieser Verweis ordnet die Variable zu, aber das Ziel hat einen schmaleren Escapebereich als die Quelle.
  • CS9086: Verzweigungen eines ref bedingten Operators können nicht auf Variablen mit inkompatiblen Deklarationsbereichen verweisen
  • CS9087: Gibt einen Parameter nach Verweis zurück, ist aber kein ref-Parameter
  • CS9089: Gibt durch Verweis ein Element des Parameters zurück, das kein ref- oder out-Parameter ist
  • CS9091: Gibt lokal durch Verweis zurück, es handelt sich jedoch nicht um eine lokale Verweisvariable
  • CS9092: Gibt einen Member der lokalen Variablen als Verweis zurück, es handelt sich jedoch nicht um eine lokale Verweisvariable
  • CS9093: Dieser Verweis ordnet zu, aber die Quelle kann der aktuellen Methode nur über eine Rückgabe-Anweisung escapen.
  • CS9094: Gibt einen Parameter durch Verweis über einen ref-Parameter zurück. Er kann jedoch nur sicher in einer Rückgabe-Anweisung zurückgegeben werden
  • CS9095: Dieser Wert wird durch Verweis auf ein Element des Parameters über einen ref-Parameter zurückgegeben. Er kann jedoch nur sicher in einer Rückgabe-Anweisung zurückgegeben werden
  • CS9097: Dieser Verweis ordnet zu, aber die Quelle weist einen breiteren Wert-Escapebereich auf als das Ziel, sodass die Zuordnung über das Ziel von Werten mit schmaleren Escapebereichen als die Quelle möglich ist.
  • CS9191: Der ref-Modifizierer für das Argument, das dem in-Parameter entspricht, entspricht in. Erwägen Sie stattdessen in zu verwenden.
  • CS9192: Das Argument sollte mit dem ref- oder in-Schlüsselwort übergeben werden.
  • CS9193: Das Argument sollte eine Variable sein, da es an einen ref readonly-Parameter übergeben wird
  • CS9195: Das Argument sollte mit dem in-Schlüsselwort übergeben werden
  • CS9196: Der Verweistypmodifizierer des Parameters stimmt nicht mit dem entsprechenden Parameter im außerkraftsetzungs- oder implementierten Element überein.
  • CS9197: Der Verweistypmodifizierer des Parameters stimmt nicht mit dem entsprechenden Parameter im ausgeblendeten Element überein.
  • CS9198: Der Verweistypmodifizierer des Parameters stimmt nicht mit dem entsprechenden Parameter im Ziel überein.
  • CS9200: Für ref readonly-Parameter wird ein Standardwert angegeben, ref readonly sollte jedoch nur für Verweise verwendet werden. Erwägen Sie das Deklarieren des Parameters als in.
  • CS9201: Das Verweisfeld sollte vor der Verwendung des Verweises zugeordnet werden.

Diese Fehler und Warnungen folgen den folgenden Designs:

In diesem Artikel wird der Begriff Verweisvariable als allgemeiner Begriff verwendet für einen Parameter mit einem der in-, ref readonly-, ref- oder out-Modifizierer oder einer ref lokalen Variablen, einem ref-Feld in einer ref struct oder einer ref-Rückgabe. Eine Verweisvariable bezieht sich auf eine andere Variable, die als Referent bezeichnet wird.

Falsche Syntax

Diese Fehler deuten darauf hin, dass Sie in Bezug auf Verweisvariablen falsche Syntax verwenden:

  • CS8373: Die linke Seite einer ref-Zuordnung muss eine Verweisvariable sein.
  • CS8388-: Eine out-Variable kann nicht als lokaler Verweis deklariert werden.
  • CS9190: readonly-Modifizierer muss nach ref angegeben werden.

Sie können den Fehler mit einer der folgenden Änderungen beheben:

  • Der linke Operand eines = ref-Operators muss eine Verweisvariable sein. Weitere Informationen zur richtigen Syntax finden Sie unter Verweisvariablen.
  • Der Parametermodifizierer ref readonly muss in dieser Reihenfolge sein. readonly ref ist kein zulässiger Parametermodifizierer. Wechseln Sie die Reihenfolge der Wörter.
  • Eine lokale Variable kann nicht als out deklariert werden. Um eine lokale Verweisvariable zu deklarieren, verwenden Sie ref.

Verweisvariableneinschränkungen

Die folgenden Fehler deuten darauf hin, dass eine Verweisvariable nicht verwendet werden kann, wenn Sie über eine Variable verfügen:

  • CS0631: ref und out sind in diesem Kontext ungültig
  • CS0767: Schnittstelle mit den angegebenen Typparametern kann nicht geerbt werden, da die Methode Überladungen enthält, die sich nur bei ref und out unterscheiden
  • CS1623: Iteratoren können nicht über ref-, in- oder out-Parameter verfügen
  • CS1741-: Ein ref- oder out-Parameter darf keinen Standardwert haben
  • CS1939: Die Bereichsvariable kann nicht als out oder ref-Parameter übergeben werden
  • CS1988: Async-Methoden können keine ref-, in- oder out-Parameter haben
  • CS7084: Ein Windows-Runtime-Ereignis wird möglicherweise nicht als out- oder ref-Parameter übergeben.
  • CS8196: Ein Verweis auf eine implizit typisierte out-Variable out ist in der gleichen Argumentliste unzulässig.
  • CS8325-: „await“ kann nicht in einem Ausdruck verwendet werden, der einen ref bedingten Operator enthält
  • CS8326: Entweder müssen beide Bedingungsoperatorwerte Bezugswerte sein, oder keiner von beiden
  • CS8327: Der Ausdruck muss vom richtigen Typ sein, um dem alternativen Bezugswert zu entsprechen
  • CS8337: Der erste Parameter einer Erweiterungsmethode „ref“ muss ein Werttyp oder ein generischer Typ sein, der auf eine Struktur beschränkt ist.
  • CS8338: Der erste „in“- oder „ref readonly“-Parameter der Erweiterungsmethode muss ein konkreter (nicht generischer) Werttyp sein.
  • CS8977: Kann nicht „ref“, „in“ oder „out“ in der Signatur einer Methode verwenden, die mit „UnmanagedCallersOnly“ zugeschrieben wird.
  • CS9072: Eine Dekonstruktionsvariable kann nicht als lokaler Verweis deklariert werden
  • CS9104: Eine using-Anweisungsressource vom Typ kann nicht in asynchronen Methoden oder asynchronen Lambda-Ausdrücken verwendet werden.
  • CS9199: Ein ref readonly-Parameter darf nicht das Attribut „Out“ aufweisen.

Die folgenden Warnungen deuten darauf hin, dass eine Verweisvariable nicht verwendet werden sollte und möglicherweise unsicher ist:

  • CS9196: Der Verweistypmodifizierer des Parameters stimmt nicht mit dem entsprechenden Parameter im außerkraftsetzungs- oder implementierten Element überein.
  • CS9197: Der Verweistypmodifizierer des Parameters stimmt nicht mit dem entsprechenden Parameter im ausgeblendeten Element überein.
  • CS9198: Der Verweistypmodifizierer des Parameters stimmt nicht mit dem entsprechenden Parameter im Ziel überein.
  • CS9200: Für ref readonly-Parameter wird ein Standardwert angegeben, ref readonly sollte jedoch nur für Verweise verwendet werden. Erwägen Sie das Deklarieren des Parameters als in.
  • CS9201: Verweisfeld sollte vor der Verwendung des Verweises zugewiesen werden.

Um den Fehler zu beheben, entfernen Sie die Verweisvariable, wo sie nicht zulässig ist:

  • Entfernen Sie in-, ref- und out-Parameter aus Indexern, Iteratoren und asynchronen Methoden.
  • Entfernen Sie bedingte Verweisausdrücke (? :), die await enthalten.
  • Entfernen Sie den ref-Modifizierer aus dem ersten Parameter einer Erweiterungsmethode, bei der dieser Typ kein Werttyp oder ein generischer Typ ist, der als Werttyp eingeschränkt ist.
  • Beide oder keine der [Bedingungsoperatorausdrücke] müssen ref-Variablen sein. Entfernen Sie entweder ref aus einem Ausdruck, oder fügen Sie ihn dem anderen hinzu. Wenn es sich um einen ref bedingten Ausdruck handelt, müssen beide Ausdrücke denselben Typ aufweisen.
  • ref- und out-Parameter können keine Standardwerte aufweisen. Entfernen Sie entweder den ref- oder out-Modifizierer oder entfernen Sie den Standardwert.
  • Eine implizit eingegebene out-Variablendeklaration darf auch nicht an anderer Stelle in derselben Argumentliste vorhanden sein.
  • Sie können keine Verweisvariablen in einer using-Anweisung in Lambda-Ausdrücken von async-Methoden einfügen.
  • Die Bereichsvariable in einem LINQ-Abfrageausdruck kann nicht per Verweis übergeben werden.
  • Sie können ein Objekt nicht in Verweisvariablen dekonstruieren. Ersetzen Sie die Verweisvariablen durch Wertvariablen.
  • Sie können nicht mehrere Schnittstellen implementieren, bei denen sich Methodenüberladungen nur bei ref und outunterscheiden. Beispielsweise deklariert void M(ref int i) eine Schnittstelle und eine andere Schnittstelle deklariert void M(out int i). Eine Klasse kann nicht beide Schnittstellen implementieren, da die Methoden nicht voneinander unterschieden werden können. Sie können nur eine dieser Schnittstellen implementieren.
  • Methoden, die mit System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute zugeschrieben werden, können keine Verweisparameter verwenden.
  • Ein Windows-Runtime-Ereignis kann nicht als Verweisvariable übergeben werden.
  • Ein ref readonly-Parameter kann nicht auf System.Runtime.InteropServices.OutAttribute in der Remoting-API angewendet werden.

unscoped ref-Beschränkungen

Der unscoped-Qualifizierer für ref-Parameter ist an einigen Stellen nicht zulässig:

  • CS9101: UnscopedRefAttribute kann nur auf Strukturinstanzmethoden und -eigenschaften angewendet werden und kann nicht auf Konstruktoren oder init-only-Member angewendet werden.
  • CS9102: UnscopedRefAttribute kann nicht auf eine Schnittstellenimplementierung angewendet werden.

Sie müssen den unscoped-Modifizierer für die Parameterdeklaration entfernen, die den Fehler verursacht hat.

Verweisvariablen erfordern einen Referent

Sie müssen eine Variable als Argument für einen Verweisparameter, einen Verweisrücklauf oder eine lokale Verweiszuweisung angeben:

  • CS0206: Eine Eigenschaft oder Indexierung, die nichts zurückgibt, wird möglicherweise nicht als out- oder ref-Wert verwendet
  • CS1510: Ein ref- oder out-Wert muss eine zuzuweisbare Variable sein

Warnungen:

  • CS9191: Der ref-Modifizierer für das Argument, das dem in-Parameter entspricht, entspricht in. Erwägen Sie stattdessen die Verwendung von in.
  • CS9192: Das Argument sollte mit dem ref- oder in-Schlüsselwort übergeben werden.
  • CS9193: Das Argument sollte eine Variable sein, da es an einen ref readonly-Parameter übergeben wird
  • CS9195: Das Argument sollte mit dem in-Schlüsselwort übergeben werden

Der Compiler gibt diese Fehler aus, wenn Sie einen Ausdruck verwenden, der einen Wert berechnet, in dem eine Variable verwendet werden muss. Sie müssen das Ergebnis dieses Ausdrucks in einer Variablen speichern, um ihn zu verwenden. Eigenschaften und Indexierungen geben z. B. Werte zurück, nicht Variablen. Sie müssen das Ergebnis in einer Variablen speichern und einen Verweis auf diese Variable übergeben.

Schreibbare Verweisvariablen erfordern einen beschreibbaren Referent

Eine schreibbare Verweisvariable erfordert, dass der Referent auch schreibbar ist. Die folgenden Fehler deuten darauf hin, dass die Variable nicht schreibbar ist:

  • CS0192: Ein readonly-Feld kann nicht als ein ref- oder out-Wert verwendet werden (außer in einem Konstruktor)
  • CS0199: Ein static readonly-Feld kann nicht als ein ref- oder out-Wert verwendet werden (außer in einem statischen Konstruktor)
  • CS1605: Die Variable kann nicht als ref- oder out-Wert verwendet werden, da sie schreibgeschützt ist
  • CS1649: Elemente eines readonly-Felds können nicht als ref- oder out-Wert verwendet werden (außer in einem Konstruktor)
  • CS1651: Felder eines static readonly-Felds können nicht als ref- oder out-Wert verwendet werden (außer in einem statischen Konstruktor)
  • CS1655: Felder vom Typ können nicht als ref- oder out-Wert verwendet werden
  • CS1657: Die Variable kann nicht als ref- oder out-Wert verwendet werden
  • CS8329: Variable kann nicht als ref- oder out-Wert verwendet werden, da es sich um eine schreibgeschützte Variable handelt
  • CS8330: Elemente der Variablen können nicht als ref- oder out-Wert verwendet werden, da es sich um schreibgeschützte Variablen handelt
  • CS8331: Kann Variablen nicht zuweisen oder als rechte Seite einer ref-Zuordnung verwenden, da es sich um schreibgeschützte Variablen handelt
  • CS8332: Kann einem Element der Variablen nicht zugewiesen oder als rechte Seite einer ref-Zuordnung verwendet werden, da es sich um eine schreibgeschützte Variable handelt

Beispiele für Variablen, die nicht schreibbar sind, sind:

  • schreibgeschützte Felder, sowohl Instanz- als auch statische Felder.
  • Elemente von readonly-Feldern.
  • Die this-Variable.
  • Die foreach-Iterationsvariable
  • Eine using-Variable oder eine fixed-Variable.

Sie müssen den Wert kopieren und einen Verweis auf die Kopie übergeben.

Verstöße gegen die Verweissicherheit

Der Compiler verfolgt den sicheren Kontext von Referenten und Verweisvariablen. Der Compiler gibt Fehler oder Warnungen in unsicherem Code aus, wenn eine Verweisvariable auf eine nicht mehr gültige Referentvariable verweist. Der Referent muss über einen sicheren Kontext verfügen, der mindestens so breit wie der verweissichere Kontext der Verweisvariablen ist. Ein Verstoß gegen diese Sicherheitsüberprüfungen bedeutet, dass die Verweisvariable auf zufälligen Speicher zugreift, anstatt auf die Referentvariable.

  • CS8166-: Kann einen Parameter nicht durch Verweis zurückgeben, da es sich nicht um einen ref-Parameter handelt
  • CS8167: Kann nicht zurückgegeben werden, indem auf ein Element des Parameters verwiesen wird, da es sich nicht um einen ref- oder out-Parameter handelt
  • CS8168: Kann nicht lokal durch Verweis zurückgegeben werden, da es sich nicht um einen lokalen Verweis handelt
  • CS8169: Kann ein Element der lokalen Variablen nicht durch Verweis zurückgeben, da es sich nicht um einen lokalen Verweis handelt
  • CS8345: Feld- oder automatisch implementierte Eigenschaft darf nicht vom Typ sein, es sei denn, es handelt sich um ein Instanzmember einer ref struct.
  • CS8351: Verzweigungen eines ref bedingten Operators können nicht auf Variablen mit inkompatiblen Deklarationsbereichen verweisen
  • CS8374: Die Quelle für die Zuweisung kann nicht über einen schmaleren Escapebereich als das Ziel verfügen.
  • CS9077: Kann einen Parameter nicht durch Verweis über einen ref-Parameter zurückgeben. Er kann nur in einer Rückgabe-Anweisung zurückgegeben werden
  • CS9078: Kann nicht zurückgegeben werden, indem auf ein Element des Parameters über einen ref-Parameter verwiesen wird, es kann nur in einer Rückgabe-Anweisung zurückgegeben werden
  • CS9079: Die Quelle kann dem Ziel nicht zugewiesen werden, da die Quelle nur der aktuellen Methode über eine Rückgabe-Anweisung escapen kann.
  • CS9096: Kann die Quelle nicht dem Ziel zuweisen, da die Quelle einen breiteren Wert-Escapebereich hat als das Ziel, was die Zuweisung über Zielwerte mit schmaleren Escapebereichen als Quelle zulässt.

Warnungen:

  • CS9085: Dieser Verweis ordnet der Zielquelle eine Quelle zu, die Quelle ordnet jedoch einen schmaleren Escapebereich als das Ziel auf.
  • CS9086: Die Verzweigungen des bedingten Verweisoperators beziehen sich auf Variablen mit inkompatiblen Deklarationsbereichen
  • CS9087: Gibt Parameter durch Verweis zurück, ist aber kein ref-Parameter
  • CS9089: Gibt durch Verweis ein Element des Parameters zurück, das kein ref- oder out-Parameter ist
  • CS9091: Gibt lokal durch Verweis zurück, es handelt sich jedoch nicht um eine lokale Verweisvariable
  • CS9092: Gibt einen Member der lokalen Variablen als Verweis zurück, es handelt sich jedoch nicht um eine lokale Verweisvariable
  • CS9093: Dieser Verweis weist die Quelle dem Ziel zu, aber die Quelle kann der aktuellen Methode nur über eine Rückgabe-Anweisung escapen.
  • CS9094: Gibt einen Parameter durch Verweis über einen ref-Parameter zurück. Er kann jedoch nur sicher in einer Rückgabe-Anweisung zurückgegeben werden
  • CS9095: Dieser Wert wird durch Verweis auf ein Element des Parameters über einen ref-Parameter zurückgegeben. Er kann jedoch nur sicher in einer Rückgabe-Anweisung zurückgegeben werden
  • CS9097: Dieser Verweis weist die Quelle dem Ziel zu, aber die Quelle hat einen breiteren Wert-Escapebereich als das Ziel, was die Zuordnung über das Ziel von Werten mit schmaleren Escapebereichen als die Quelle zulässt.

Der Compiler verwendet statische Analysen, um festzustellen, ob der Referent an allen Punkten gültig ist, an denen die Verweisvariable verwendet werden kann. Sie müssen Code umgestalten, damit der Referent an allen Stellen gültig bleibt, an denen sich die Verweisvariable möglicherweise darauf beziehen kann. Ausführliche Informationen zu den Regeln für die Verweissicherheit finden Sie im C#-Standard für verweissichere Kontexte.