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.
Die folgenden Fehler können generiert werden, wenn Referenzvariable Sicherheitsregeln verletzt werden:
-
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- oderout-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 Instanzmemm einer
ref struct. -
CS8351: Verzweigungen eines
refbedingten 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.
- CS9075: Ein Parameter kann nicht durch Verweis zurückgegeben werden, da er auf die aktuelle Methode festgelegt ist.
- CS9076: Kann nicht zurückgegeben werden, indem auf ein Element des Parameters verwiesen wird, da er auf die aktuelle Methode festgelegt ist.
-
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: Die Quelle kann dem Ziel nicht zugewiesen werden, da die Quelle nur die aktuelle Methode über eine return-Anweisung verlassen kann.
- CS9096: Die Quelle kann dem Ziel nicht zugewiesen werden, da die Quelle einen weiteren Gültigkeitsbereich für Escape hat als das Ziel, was die Zuordnung über das Ziel von Werten mit engerem Gültigkeitsbereich für Escape als die Quelle zulässt.
Die folgenden Warnungen werden generiert, wenn Sicherheitsregeln für Referenzvariablen verletzt werden:
- CS9080: Verwendung der Variablen in diesem Kontext kann referenzierte Variablen außerhalb ihres Deklarationsbereichs verfügbar machen.
- CS9081: Ein Ergebnis eines Stackalloc-Ausdrucks vom Typ in diesem Kontext kann außerhalb der enthaltenden Methode verfügbar gemacht werden.
- CS9082: Lokal wird durch Verweis zurückgegeben, wurde jedoch in einen Wert initialisiert, der nicht durch Verweis zurückgegeben werden kann
- CS9083: Ein Element wird durch Verweis zurückgegeben, wurde jedoch in einen Wert initialisiert, der nicht durch Verweis zurückgegeben werden kann.
- CS9084: Struct-Member gibt 'this' oder andere Instanzmember als Referenz zurück.
- CS9085: Diese Referenzzuweisung übergibt eine Quelle an das Ziel, wobei die Quelle jedoch einen engeren Escapebereich als das Ziel hat.
- CS9086: Die Zweige des bedingten Referenzoperators beziehen sich auf Variablen mit inkompatiblen Deklarationsbereichen.
-
CS9087: Gibt einen Parameter nach Verweis zurück, ist aber kein
ref-Parameter - CS9088: Ein Parameter wird durch Referenz zurückgegeben, ist jedoch auf den Gültigkeitsbereich der aktuellen Methode beschränkt.
-
CS9089: Gibt durch Verweis ein Element des Parameters zurück, das kein
ref- oderout-Parameter ist - CS9090: Dieser Wert wird zurückgegeben, indem auf ein Element des Parameters verwiesen wird, das auf die aktuelle Methode festgelegt 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: Diese Referenz weist die Quelle dem Ziel zu, aber die Quelle kann die aktuelle Methode nur über eine Rückgabeanweisung verlassen.
-
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: Diese Zuweisung ordnet eine Quelle dem Ziel zu, jedoch hat die Quelle einen größeren Bereich für Wertausnahmen als das Ziel, was die Zuweisung von Werten über das Ziel ermöglicht, die engere Ausweichbereiche als die Quelle haben.
Zurückgeben von Referenzen mit inkompatiblen Geltungsbereichen
Der Compiler verhindert, dass Sie einen Verweis auf eine Variable zurückgeben, wenn die Lebensdauer der Variablen nicht über den Bereich der Methode hinausgeht. Diese Fehler treten auf, wenn versucht wird, per Referenz einen Parameter, eine lokale Variable oder ein Mitglied zurückzugeben, das nicht mit ref deklariert ist oder dessen Gültigkeitsbereich auf die aktuelle Methode beschränkt ist.
Fehler:
-
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- oderout-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
- CS9075: Ein Parameter kann nicht durch Verweis zurückgegeben werden, da er auf die aktuelle Methode festgelegt ist.
- CS9076: Kann nicht zurückgegeben werden, indem auf ein Element des Parameters verwiesen wird, da er auf die aktuelle Methode festgelegt ist.
-
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
Warnungen:
-
CS9087: Gibt Parameter durch Verweis zurück, ist aber kein
ref-Parameter - CS9088: Gibt einen Parameter als Referenz zurück, ist jedoch auf die aktuelle Methode beschränkt.
-
CS9089: Gibt durch Verweis ein Element des Parameters zurück, das kein
ref- oderout-Parameter ist - CS9090: Dies gibt eine Referenz auf ein Mitglied des Parameters zurück, das auf die aktuelle Methode beschränkt 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
-
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
So beheben Sie diese Fehler:
- Ändern Sie die Methodensignatur so, dass Parameter mit dem
refSchlüsselwort deklariert werden, anstatt sie nach Wert zu übergeben, wodurch der Speicherort des Parameters sicher zurückgegeben werden kann, da der Aufrufer die Lebensdauer der Variablen steuert (CS8166, CS8167, CS9087, CS9089). - Deklarieren Sie sie für lokale Variablen als
reflokal, indem Sie sie aus einem Verweisrückgabeausdruck oder einem Verweisparameter zuweisen, wodurch sichergestellt wird, dass der lokale Speicher mit ausreichender Lebensdauer verwendet wird, anstatt eine neue Variable mit methodenbereichsbezogener Lebensdauer (CS8168, CS8169, CS9091, CS9092) zu erstellen. - Wenn ein Parameter mit dem
scopedModifizierer deklariert wird, vermeiden Sie die Rückgabe durch einen Verweis, da der Modifizierer den Verweis des Parameters explizit darauf beschränkt, der Methode zu entkommen, um potenzielle Dangling-Referenzen zu verhindern (CS9075, CS9076, CS9088, CS9090). - Wenn Sie einen Verweis zurückgeben müssen, der von einem
refParameter stammt, verwenden Sie eine direktereturn refAnweisung, anstatt den Verweis einem anderenrefParameter zuzuweisen und dies zurückzugeben, da der Compiler den Escapebereich nur über direkte Rückgabeanweisungen nachverfolgen kann (CS9077, CS9078, CS9094, CS9095).
Weitere Informationen zu Bezugssicherheitsregeln finden Sie im Artikel " Ref Returns" und im C#-Standardabschnitt zu bezugssicheren Kontexten.
Verweiszuweisungen mit inkompatiblen Gültigkeitsbereichen
Der Compiler verhindert Verweiszuweisungsvorgänge, bei denen die Quellvariable einen schmaleren Escapebereich als das Ziel aufweist. Eine Referenzzuweisung erstellt eine Referenz vom Ziel zum Speicherort der Quelle. Wenn die Quelle vor dem Ziel außerhalb des Gültigkeitsbereichs gehen könnte, verweist das Ziel auf ungültigen Speicher.
Fehler:
- CS8374: Die Quelle für die Zuweisung kann nicht über einen schmaleren Escapebereich als das Ziel verfügen.
- 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.
- CS9093: Dieser Verweis weist die Quelle dem Ziel zu, aber die Quelle kann der aktuellen Methode nur über eine Rückgabe-Anweisung escapen.
- 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.
So beheben Sie diese Fehler:
- Strukturieren Sie den Code so um, dass die Quellvariable in einer Bezugszuweisung einen Ausweichbereich hat, der mindestens so weit ist wie der der Zielvariable. Dies stellt sicher, dass der Zielverweis für seine gesamte Lebensdauer gültig bleibt und verhindert hervorstehende Referenzen (CS8374, CS9085).
- Wenn eine Variable die Methode nur über eine Rückgabeklausel escapen kann, weisen Sie sie nicht Variablen zu
ref, auf die auf andere Weise zugegriffen wird. Beispiele hierfür sind das Speichern in Feldern oder das Zurückgeben durch Verweisparameter. Diese Aktionen verstoßen gegen die Einschränkung, dass die Quelle nur in Rückgabebefehlen (CS9079, CS9093) verwendet werden darf. - Stellen Sie bei Bezugszuweisungen, bei denen Werte Fluchtbereiche umfassen, sicher, dass der Fluchtbereich der Quelle nicht breiter als der des Zieles ist, da eine nicht übereinstimmende Zuweisung es ermöglichen würde, Werte mit engerem Bereich über den Zielverweis zuzuweisen, wodurch möglicherweise Verweise auf flüchtige Werte (CS9096, CS9097) erstellt werden.
Weitere Informationen zu Bezugssicherheitsregeln finden Sie im Artikel " Ref Returns" und im C#-Standardabschnitt zu bezugssicheren Kontexten.
Escape-Umfangsverletzungen und bedingte Operatoren
Der Compiler verfolgt, wie Variablen ihren Deklarationsbereich über verschiedene Vorgänge escapen können. Diese Fehler treten auf, wenn Variablen in Kontexten verwendet werden, die referenzierte Variablen außerhalb ihrer gültigen Lebensdauer verfügbar machen können, einschließlich verweisbedingter Operatoren und Stackalloc-Ausdrücken.
Fehler:
-
CS8351: Verzweigungen eines
refbedingten Operators können nicht auf Variablen mit inkompatiblen Deklarationsbereichen verweisen
Warnungen:
- CS9080: Verwendung der Variablen in diesem Kontext kann referenzierte Variablen außerhalb ihres Deklarationsbereichs verfügbar machen.
- CS9081: Ein Ergebnis eines Stackalloc-Ausdrucks vom Typ in diesem Kontext kann außerhalb der enthaltenden Methode verfügbar gemacht werden.
- CS9086: Die Verzweigungen des bedingten Verweisoperators beziehen sich auf Variablen mit inkompatiblen Deklarationsbereichen
So beheben Sie diese Fehler:
- Ändern Sie den bedingten Verweisoperator (der
?:Operator mitrefRückgaben), sodass sowohl die wahr- als auch die falsch-Verzweigung auf Variablen mit kompatiblen Deklarationsbereichen verweisen. Dies bedeutet, dass beide Variablen über Lebensdauern verfügen müssen, die sich auf mindestens dieselbe Bereichsebene erstrecken und verhindern, dass der bedingte Ausdruck möglicherweise einen Verweis zurückgibt, der ungültig wird (CS8351, CS9086). - Stellen Sie bei Verwendung von Variablen in Ausdrücken oder Methodenaufrufen sicher, dass der Kontext nicht zulässt, dass referenzierte Variablen außerhalb ihres Deklarationsbereichs escapen können. Dies bedeutet in der Regel, dass Bereichsvariablen nicht an Methoden oder Ausdrücke übergeben werden, in denen sie möglicherweise erfasst oder über ihre beabsichtigte Lebensdauer (CS9080) hinaus gespeichert werden.
- Vermeiden Sie bei Stackalloc-Ausdrücken das Zuweisen des Ergebnisses zu Variablen oder die Verwendung in Kontexten, in denen auf den stapelzugewiesenen Speicher außerhalb der enthaltenden Methode zugegriffen werden kann. Der stapelzugewiesene Speicher wird automatisch freigegeben, wenn die Methode zurückkehrt, und ein Zugriff danach führt zu undefiniertem Verhalten (CS9081).
Weitere Informationen finden Sie im Artikel " Ref Returns", im Artikel zur Speicherauslastung und im C#-Standardabschnitt zu referenzsicheren Kontexten.
Struktmitglied- und Feldeinschränkungen
Der Compiler erzwingt spezielle Regeln für Strukturmitglieder und -felder, um zu verhindern, dass Verweise hängen bleiben. Diese Fehler treten auf, wenn Strukturmitglieder Verweise auf den Instanzzustand zurückgeben oder wenn Felder Typen aufweisen, die spezielle Behandlungsarten erfordern.
Fehler:
-
CS8345: Feld- oder automatisch implementierte Eigenschaft darf nicht vom Typ sein, es sei denn, es handelt sich um ein Instanzmember einer
ref struct.
Warnungen:
- CS9082: Lokal wird durch Verweis zurückgegeben, wurde jedoch in einen Wert initialisiert, der nicht durch Verweis zurückgegeben werden kann
- CS9083: Ein Element wird durch Verweis zurückgegeben, wurde jedoch in einen Wert initialisiert, der nicht durch Verweis zurückgegeben werden kann.
- CS9084: Struct-Member gibt 'this' oder andere Instanzmitglieder als Referenz zurück.
So beheben Sie diese Fehler:
- Stellen Sie sicher, dass Felder und automatisch implementierte Eigenschaften mit ref-ähnlichen Typen (wie
Span<T>- oderref struct-Typen) nur als Instanzmember innerhalb eines ref struct deklariert werden, anstatt in regulären Strukturen oder Klassen, da ref-ähnliche Typen sicher nur im Stack existieren können und ref structs die erforderlichen Lebensdauer-Garantien (CS8345) bieten. - Stellen Sie beim Zurückgeben einer lokalen Variablen anhand eines Verweises aus einer Methode sicher, dass das lokale Element aus einer Quelle initialisiert wurde, die über einen ausreichenden Escapebereich verfügt, z. B. einen Verweisparameter oder einen Methodenaufruf mit Verweisrückgabe, anstatt von einem werttypisierten Ausdruck oder einer variablen mit lokalem Bereich, die einen Verweis auf den kurzlebigen Speicher (CS9082, CS9083) erstellen würde.
- Vermeiden Sie in Struct-Instanzmethoden oder -eigenschaften das Zurückgeben von
thisoder von Instanzfeldern über Referenz, da es sich bei Structs um Werttypen handelt, die häufig kopiert werden, und das Zurückgeben eines Verweises auf ein Instanzmember kann einen Verweis auf eine temporäre Kopie erstellen, die nach der Rückgabe der Methode zerstört wird (CS9084).
Weitere Informationen finden Sie im Artikel zu Referenzstrukturtypen und im C#-Standardabschnitt zu refsicheren Kontexten.