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 Sie mit Verweisvariablen arbeiten:
-
CS0192: Ein
readonly-Feld kann nicht als einref- oderout-Wert verwendet werden (außer in einem Konstruktor) -
CS0199: Ein
static readonly-Feld kann nicht als einref- oderout-Wert verwendet werden (außer in einem statischen Konstruktor) -
CS0206: Eine Eigenschaft oder ein Indexer, der nichts zurückgibt, kann nicht als ein
out- oderref-Wert verwendet werden -
CS0631:
refundoutsind 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
refundoutunterscheiden -
CS1510: Ein
ref- oderout-Wert muss eine zuzuweisende Variable sein -
CS1605: Variable kann nicht als
ref- oderout-Wert verwendet werden, da sie schreibgeschützt ist -
CS1623: Iteratoren können nicht
ref-,in- oderout-Parameter haben -
CS1649: Elemente eines
readonly-Felds können nicht als einref- oderout-Wert verwendet werden (außer in einem Konstruktor) -
CS1651: Felder eines statischen schreibgeschützten Felds können nicht als
ref- oderout-Wert verwendet werden (außer in einem statischen Konstruktor) -
CS1655: Felder vom Typ können nicht als
ref- oderout-Wert verwendet werden -
CS1657: Variable kann nicht als
ref- oderout-Wert verwendet werden -
CS1741: Ein
ref- oderout-Parameter darf keinen Standardwert haben -
CS1939: Die Bereichsvariable kann nicht als
outoderref-Parameter übergeben werden -
CS1988: Async-Methoden können keine
ref-,in- oderout-Parameter haben -
CS7084: Ein Windows-Runtime-Ereignis wird möglicherweise nicht als
out- oderref-Parameter übergeben. - 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 einenrefbedingten 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- oderout-Wert verwendet werden, da es sich um eine schreibgeschützte Variable handelt -
CS8330: Elemente der Variablen können nicht als
ref- oderout-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. -
CS8373: Die linke Seite einer
ref-Zuordnung muss eine Verweisvariable sein. -
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. - CS8986: Der Modifizierer "scoped" des Parameters stimmt nicht mit dem Ziel überein.
- CS8987: Der Modifizierer "scoped" des Parameters stimmt nicht mit überschriebenen oder implementierten Mitgliedern überein.
- CS9061: Der 'scoped'-Modifizierer kann nicht mit 'discard' verwendet werden.
- CS9062: Typen und Aliase können nicht mit dem Namen "scoped" benannt werden.
- CS9063: UnscopedRefAttribute kann nicht auf diesen Parameter angewendet werden, da sie standardmäßig nicht bereichslos ist.
- CS9065: Verwenden Sie nicht "System.Runtime.CompilerServices.ScopedRefAttribute". Verwenden Sie stattdessen das Schlüsselwort "scoped".
- CS9066: UnscopedRefAttribute kann nicht auf Parameter angewendet werden, die einen 'scoped' Modifizierer aufweisen.
- CS9072: Eine Dekonstruktionsvariable kann nicht als lokaler Verweis deklariert werden
- CS9101: UnscopedRefAttribute kann nur auf Strukturinstanzmethoden und -eigenschaften oder Methoden und Eigenschaften der virtuellen Schnittstelleninstanz angewendet werden und kann nicht auf Konstruktoren oder init-only-Member angewendet werden.
- CS9102: UnscopedRefAttribute kann nicht auf eine Schnittstellenimplementierung angewendet werden, da das implementierte Element nicht über dieses Attribut verfügt.
-
CS9104: Eine
using-Anweisungsressource vom Typ kann nicht in asynchronen Methoden oder asynchronen Lambda-Ausdrücken verwendet werden. -
CS9190:
readonly-Modifizierer muss nachrefangegeben werden. -
CS9199: Ein
ref readonly-Parameter darf nicht über das Attribut „Out“ verfügen.
Die folgenden Warnungen werden generiert, wenn Verweisvariablen falsch verwendet werden:
- CS9073: Der Modifizierer "scoped" des Parameters stimmt nicht mit dem Ziel überein.
- CS9074: Der Modifizierer "scoped" des Parameters entspricht nicht dem überschriebenen oder implementierten Mitglied.
-
CS9191: Der
ref-Modifizierer für das Argument, das demin-Parameter entspricht, entsprichtin. Erwägen Sie stattdesseninzu verwenden. -
CS9192: Das Argument sollte mit dem
ref- oderin-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 readonlysollte jedoch nur für Verweise verwendet werden. Erwägen Sie das Deklarieren des Parameters alsin. - CS9201: Verweisfeld sollte vor der Verwendung des Verweises zugewiesen werden.
- CS9265: Das Feld wird niemals referenziert und hat immer seinen Standardwert (Nullverweis)
Diese Fehler und Warnungen folgen den folgenden Designs:
- Falsche Syntax: Die Syntax Ihrer Deklaration oder deren Verwendung ist ungültig.
-
Sprachkonstrukte, bei denen
ref-Variablen ungültig sind: Einige C#-Idiome lassen keine Variablen zu. Dies liegt in der Regel daran, dass die Verweissicherheitsanalyse nicht zuverlässig durchgeführt werden kann. - Wertausdruck, der verwendet wird, wenn eine Bezugsvariable erforderlich ist: Der Ausdruck, der als Verweisvariable verwendet wird, muss eine Variable und kein Wertausdruck sein.
- Schreibbare Verweisvariablen, die auf schreibgeschützte Variablen verweisen: Ein Verweis auf eine schreibgeschützte Variable kann nicht durch schreibbaree Verweise übergeben werden.
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 nachrefangegeben werden.
So beheben Sie diese Fehler:
- Stellen Sie sicher, dass der linke Operand eines
= refOperators eine Referenzvariable anstelle eines Wertausdrucks oder eines nicht referenzierbaren lokalen Werts ist. Für die Verweiszuweisung müssen beide Seiten Referenzvariablen sein, die einen Alias für denselben Speicherort (CS8373) erstellen können. - Schreiben Sie beim Deklarieren von Referenzparametern den Modifizierer als
ref readonlynichtreadonly ref. Für die C#-Sprachspezifikation muss dasrefSchlüsselwort vor demreadonlyModifizierer in Parameterdeklarationen stehen, um eine konsistente Syntax für alle Referenzparametertypen (CS9190) beizubehalten. - Verwenden Sie das
refSchlüsselwort, wenn Sie lokale Referenzvariablen anstelle vonoutdeklarieren.outist ausschließlich ein Parametermodifizierer, der angibt, dass eine Methode vor der Rückgabe einen Wert zuweisen muss, währendrefdas entsprechende Schlüsselwort zum Erstellen lokaler Variablen ist, die andere Speicherorte (CS8388) aliasen. Weitere Informationen zu Referenzvariablen und deren Syntaxanforderungen finden Sie unter Referenzvariablen und der C#-Sprachspezifikation.
Verweisvariableneinschränkungen
Die folgenden Fehler deuten darauf hin, dass eine Verweisvariable nicht verwendet werden kann, wenn Sie über eine Variable verfügen:
-
CS0631:
refundoutsind 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
refundoutunterscheiden -
CS1623: Iteratoren können nicht über
ref-,in- oderout-Parameter verfügen -
CS1741-: Ein
ref- oderout-Parameter darf keinen Standardwert haben -
CS1939: Die Bereichsvariable kann nicht als
outoderref-Parameter übergeben werden -
CS1988: Async-Methoden können keine
ref-,in- oderout-Parameter haben -
CS7084: Ein Windows-Runtime-Ereignis wird möglicherweise nicht als
out- oderref-Parameter übergeben. -
CS8196: Ein Verweis auf eine implizit typisierte out-Variable
outist in der gleichen Argumentliste unzulässig. -
CS8325-: „await“ kann nicht in einem Ausdruck verwendet werden, der einen
refbedingten 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 readonlysollte jedoch nur für Verweise verwendet werden. Erwägen Sie das Deklarieren des Parameters alsin. - CS9201: Verweisfeld sollte vor der Verwendung des Verweises zugewiesen werden.
- CS9265: Das Feld wird niemals referenziert und hat immer seinen Standardwert (Nullverweis)
So beheben Sie diese Fehler:
- Entfernen von Referenzparametern aus Indexern. Indexer sind so konzipiert, dass arrayähnliche Zugriffssyntax bereitgestellt wird, und der Compiler kann keine sichere Lebensdauernachverfolgung für Verweise garantieren, die über Indexer-Accessoren (CS0631, CS1623) übergeben werden.
- Entfernen Von Referenzparametern aus Iteratormethoden. Iteratoren führen Code lazily über mehrere Aufrufe mithilfe von Zustandscomputern aus, und der Compiler kann nicht sicherstellen, dass referenzierte Variablen über Rückgabegrenzen hinweg gültig bleiben, wenn die Ausführung angehalten und fortgesetzt wird (CS1623).
- Entfernen von Referenzparametern aus asynchronen Methoden. Asynchrone Methoden können die Ausführung an Await-Punkten anhalten und in verschiedenen Threads fortgesetzt werden, sodass es unmöglich ist, sicherzustellen, dass referenzierte Variablen während der Ausführung der Methode (CS1988) gültig und zugänglich bleiben.
- Vermeiden Sie die Verwendung von Await-Ausdrücken innerhalb von bedingten Ref-Ausdrücken. Der Await-Vorgang kann die Ausführung anhalten und die vom bedingten Operator ausgewählten Verweise ungültig machen, was zur potenziellen Verwendung ungültiger Verweise führt, wenn die Ausführung fortgesetzt wird (CS8325).
- Stellen Sie sicher, dass beide Zweige eines bedingten Referenzoperators entweder Verweise zurückgeben oder keine Verweise zurückgeben. Wenn beide Verweise sind, müssen sie vom gleichen Typ sein. Der bedingte Operator muss einen konsistenten Ergebnistyp erzeugen, der vom aufrufenden Code unabhängig davon, welche Verzweigung ausgewählt ist (CS8326, CS8327) sicher verwendet werden kann.
- Entfernen Sie die Standardwerte aus den
ref- undout-Parametern. Referenzparameter müssen immer an der Aufrufwebsite bereitgestellt werden, um die erforderliche Aliasingbeziehung zwischen dem Parameter und einer vorhandenen Variable einzurichten, wodurch Standardwerte semantisch bedeutungslos (CS1741) werden. - Vermeiden Sie das Deklarieren einer implizit typierten
outVariablen in einer Argumentliste, die auch auf dieselbe Variable verweist. Der Compiler muss den Typ der Variablen von der Methodensignatur ableiten und gleichzeitig die Verwendung dieser Variablen innerhalb desselben Ausdrucks überprüfen, wodurch eine Zirkelabhängigkeit (CS8196) erstellt wird. - Übergeben Sie LINQ-Abfragebereichsvariablen nicht als Referenzparameter. Bereichsvariablen sind compilergenerierte Iterationsvariablen, deren Lebensdauer vom Abfrageausführungsmodell verwaltet wird und keine stabilen Speicherspeicherorte aufweisen, auf die sicher verwiesen werden kann (CS1939).
- Verwenden Sie reguläre Wertvariablen anstelle von Ref Locals, wenn Objekte dekonstruieren. Deconstruction erstellt neue Variablen, um die deconstrukturierten Werte zu empfangen, und Referenzvariablen würden versuchen, diese temporären Werte zu aliasen, anstatt sie unabhängig zu speichern (CS9072).
- Vermeiden Sie die Implementierung mehrerer Schnittstellen, bei denen sich Methoden nur durch
ref- undout-Modifizierer bei den Parametern unterscheiden. Die C#-Sprachspezifikation behandelt diese als unterschiedliche Signaturen, bietet jedoch keine Möglichkeit, zu unterscheiden, welche Implementierung aufgerufen werden soll, da beide undrefoutdie gleiche Aufrufensyntax an Implementierungsgrenzen (CS0767) gemeinsam verwendet werden. - Entfernen Sie Referenzparameter aus Methoden, die mit System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute dekoriert sind. Diese Methoden können von nicht verwaltetem Code aufgerufen werden, der die Referenzsicherheitsregeln von C# nicht versteht und die ordnungsgemäße Verwaltung von referenzierten Variablen über die verwaltete/nicht verwaltete Grenze (CS8977) hinweg nicht garantieren kann.
- Verwenden Sie den
refModifizierer für die ersten Parameter der Erweiterungsmethode nur für Werttypen oder generische Typen, die auf Werttypen beschränkt sind. Referenztypen werden auf der CLR-Ebene per Referenz übergeben, und das Hinzufügen vonrefwürde einen Verweis auf einen Verweis erstellen, während Werttyperweiterungen mitrefdie Mutation der erweiterten Instanz ermöglichen (CS8337, CS8338). - Übergeben Sie Windows-Runtime-Ereignisse nicht als Referenzparameter. Diese Ereignisse folgen dem Windows-Runtime-Typsystem, das eine andere Lebensdauer- und Threadingsemantik aufweist als .NET-Verweise und unterstützt nicht das Aliasingverhalten, das von C#-Referenzparametern (CS7084) benötigt wird.
- Entfernen Sie die System.Runtime.InteropServices.OutAttribute von
ref readonlyParametern. Dieses Attribut wurde für Marshalling-Semantik in Plattformaufrufszenarien entwickelt, in denen die Parameterrichtung nur ausgehend ist. Dies steht im Konflikt mit der Garantie vonref readonly, dass der Parameter auf vorhandene Daten verweist, die nicht neu zugewiesen werden (CS9199). - Stellen Sie sicher, dass alle
refFelder in einem Typ entweder in Feldinitialisierern oder in allen Konstruktorpfaden zugewiesen werden, bevor der Konstruktor abgeschlossen ist. Nicht initialisierte Verweisfelder enthalten ungültige Verweise, die zu Speicherbeschädigungen führen könnten (CS9201, CS9265). - Vergleichen Sie die Modifizierer der Referenzart (
ref,in,out,ref readonly) zwischen einer Methode und ihrer überschriebenen Basismethode oder implementierten Schnittstellenmethode. Der Verweismodifizierer ist Teil des Methodensignaturvertrags, der abgeleitete Typen berücksichtigen muss, um substitutierbarkeit und Aufrufererwartungen aufrechtzuerhalten (CS9196, CS9197, CS9198). - Deklarieren Sie Parameter als
in, anstattref readonly, wenn Sie Standardwerte angeben.ref readonlyist für Szenarien konzipiert, in denen der Aufrufer einen Verweis auf eine vorhandene Variable übergibt, währendinParameter sowohl Verweise als auch temporäre Kopien von Werten akzeptieren können, wodurch Standardwerte sinnvoll sind (CS9200).
Weitere Informationen dazu, wo Referenzvariablen zulässig sind, finden Sie unter Methodenparameter, Iteratoren, asynchrone Programmiermuster und die C#-Sprachspezifikation.
unscoped ref-Beschränkungen
Der unscoped-Qualifizierer für ref-Parameter ist an einigen Stellen nicht zulässig:
- CS9101: UnscopedRefAttribute kann nur auf Strukturinstanz- oder virtuelle Schnittstellenmethoden und -eigenschaften angewendet werden und kann nicht auf Konstruktoren oder init-only-Member angewendet werden.
- CS9102: UnscopedRefAttribute kann nicht auf eine Schnittstellenimplementierung angewendet werden, da das implementierte Element nicht über dieses Attribut verfügt.
So beheben Sie diese Fehler:
- Entfernen Sie den
unscopedModifizierer oder das System.Diagnostics.CodeAnalysis.UnscopedRefAttribute Attribut aus Strukturkonstruktoren und nur Initialisierer-Mitgliedern. Diese Member verfügen über spezielle Initialisierungsemantik, bei der der Compiler sicherstellen muss, dass alle Verweise die Initialisierungsphase nicht überdauern, und das Zulassen von nicht erfassten Verweisen würde die Garantie verletzen, dass die Initialisierung abgeschlossen ist, bevor die Struktur vollständig zugänglich wird (CS9101). - Entfernen Sie den
unscopedModifizierer aus Schnittstellenimplementierungsmethoden, wenn die entsprechende Schnittstellenmethode ihn nicht enthält. Das nicht bereichsbezogene Merkmal wirkt sich auf den Vertrag der Methode hinsichtlich der Garantie für die Referenzlebensdauer aus, und Implementierungen müssen den gleichen Vertrag wie die Schnittstelle beibehalten, die sie implementieren, um sicherzustellen, dass Aufrufer sich auf ein konsistentes Lebensdauerverhalten verlassen können, unabhängig davon, welche Implementierung aufgerufen wird (CS9102).
Weitere Informationen zu bereichsgebundenen und nicht bereichsbezogenen Verweisen finden Sie unter Methodenparameter und der Spezifikation für Verbesserungen von Low-Level-Strukturen.
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- oderref-Wert verwendet -
CS1510: Ein
ref- oderout-Wert muss eine zuzuweisbare Variable sein
Warnungen:
-
CS9191: Der
ref-Modifizierer für das Argument, das demin-Parameter entspricht, entsprichtin. Erwägen Sie stattdessen die Verwendung vonin. -
CS9192: Das Argument sollte mit dem
ref- oderin-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
So beheben Sie diese Fehler:
- Speichern Sie das Ergebnis eines Eigenschafts- oder Indexerzugriffs in einer lokalen Variablen, bevor Sie es als Referenzparameter übergeben. Eigenschaften und Indexer sind Methoden, die Werte zurückgeben, anstatt direkten Zugriff auf Speicherorte bereitzustellen, und Referenzparameter erfordern eine tatsächliche Variable mit einem stabilen Speicherspeicherort, der aliased werden kann (CS0206, CS1510).
- Verwenden Sie den
inModifizierer anstelle der Übergabe vonrefArgumenten aninParameter. Währendreftechnisch aufgrund der Abwärtskompatibilität funktioniert, drückt derinModifizierer deutlicher die Absicht aus, dass das Argument schreibgeschützt ist und effizienter als Verweis ohne Kopieren (CS9191, CS9195) übergeben werden kann. - Fügen Sie den entsprechenden Verweismodifizierer (
ref,inoderref readonly) hinzu, wenn Argumente an Parameter übergeben werden, die Verweise erwarten. Das Auslassen des Modifizierers kann dazu führen, dass der Compiler eine temporäre Kopie des Werts erstellt, was ineffizient ist und zu unerwartetem Verhalten führen kann, wenn der aufrufende Code erwartet, dass Änderungen in der ursprünglichen Variablen (CS9192, CS9193) widerzuspiegeln sind.
Weitere Informationen zu Referenzparametern und Übergeben von Variablen nach Verweis finden Sie unter Methodenparameter, Ref-Schlüsselwort und C #-Sprachspezifikation.
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 einref- oderout-Wert verwendet werden (außer in einem Konstruktor) -
CS0199: Ein
static readonly-Feld kann nicht als einref- oderout-Wert verwendet werden (außer in einem statischen Konstruktor) -
CS1605: Die Variable kann nicht als
ref- oderout-Wert verwendet werden, da sie schreibgeschützt ist -
CS1649: Elemente eines
readonly-Felds können nicht alsref- oderout-Wert verwendet werden (außer in einem Konstruktor) -
CS1651: Felder eines
static readonly-Felds können nicht alsref- oderout-Wert verwendet werden (außer in einem statischen Konstruktor) -
CS1655: Felder vom Typ können nicht als
ref- oderout-Wert verwendet werden -
CS1657: Die Variable kann nicht als
ref- oderout-Wert verwendet werden -
CS8329: Variable kann nicht als
ref- oderout-Wert verwendet werden, da es sich um eine schreibgeschützte Variable handelt -
CS8330: Elemente der Variablen können nicht als
ref- oderout-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
So beheben Sie diese Fehler:
- Kopieren Sie den Wert aus einem readonly-Feld in eine lokale Variable, und übergeben Sie die lokale Variable als
refoderoutParameter. Readonly-Felder sind nach der Initialisierung unveränderlich (außer innerhalb von Konstruktoren), und das Zulassen schreibbarer Verweise auf sie würde gegen die Unveränderlichkeitsgarantie verstoßen, die readonly bereitstellt (CS0192, CS0199, CS1649, CS1651). - Verwenden Sie
ref readonlyoderinParameter anstelle vonrefoderout, wenn Sie readonly-Variablen, Iterationsvariablen oder andere nicht schreibbare Werte per Verweis übergeben müssen. Diese Modifizierer geben an, dass die Methode nur den referenzierten Wert liest, ohne zu versuchen, ihn zu ändern. Dies entspricht den Unveränderlichkeitseinschränkungen der ursprünglichen Variablen (CS1605, CS1655, CS1657, CS8329). - Kopieren Sie Elemente von readonly-Variablen in lokale Variablen, bevor Sie sie als beschreibbare Verweise übergeben. Obwohl das Mitglied selbst möglicherweise nicht als readonly deklariert wird, wird auf ihn über einen readonly-Pfad (über ein readonly-Feld,
in-Parameter oderref readonly-Lokal) zugegriffen, und der Compiler erzwingt die Transitivität der Readonly-Eigenschaft, um indirekte Änderungen von readonly-Daten (CS8330, CS8332) zu verhindern. - Vermeiden Sie zuweisbare Verknüpfungen zu readonly Variablen, foreach-Iterationsvariablen, using-Anweisungsressourcen oder fixed-Anweisungsvariablen. Diese Variablen verfügen über spezielle Lebensdauersemantik, die vom Compiler verwaltet wird. Die Variable wird am Ende ihres Gültigkeitsbereichs automatisch abgeschlossen oder verworfen. Externe Verweise erzeugen nach der Entsorgung schwebende Referenzen (CS8331).
Weitere Informationen zu Readonly-Semantik und Referenzparametern finden Sie unter readonly-Schlüsselwortin Parametermodifizierer, Ref readonly und der C#-Sprachspezifikation.