Delen via


Fouten en waarschuwingen die zijn gekoppeld aan referentieparameters, variabelen en retourneert

De volgende fouten kunnen worden gegenereerd wanneer u met verwijzingsvariabelen werkt:

  • CS0192: Een readonly veld kan niet worden gebruikt als een ref of out waarde (behalve in een constructor)
  • CS0199: Een static readonly veld kan niet worden gebruikt als een ref of out waarde (behalve in een statische constructor)
  • CS0206: Een niet-retournerende eigenschap of indexeerfunctie kan niet worden gebruikt als een out of ref waarde
  • CS0631: ref en out zijn niet geldig in deze context
  • CS0767: Kan de interface met de opgegeven typeparameters niet overnemen, omdat deze methode overbelastingen veroorzaakt die alleen ref verschillen op en out
  • CS1510: A ref of out waarde moet een toewijsbare variabele zijn
  • CS1605: Kan variabele niet gebruiken als een ref of out waarde omdat deze alleen-lezen is
  • CS1623: Iterators kunnen geen of in out parameters hebben ref
  • CS1649: Leden van een readonly veld kunnen niet worden gebruikt als een ref of out waarde (behalve in een constructor)
  • CS1651: Velden van een statisch alleen-lezen veld kunnen niet worden gebruikt als een ref of out waarde (behalve in een statische constructor)
  • CS1655: Kan geen velden van het type gebruiken als een ref of out waarde
  • CS1657: Kan variabele niet gebruiken als een ref of out waarde
  • CS1741: A ref of out parameter kan geen standaardwaarde hebben
  • CS1939: Kan de bereikvariabele niet doorgeven als een out of ref parameter
  • CS1988: Async-methoden kunnen geen of out in parameters hebben ref
  • CS7084: Een Windows Runtime-gebeurtenis kan niet worden doorgegeven als een out of ref parameter.
  • CS8166: Kan een parameter niet retourneren op basis van verwijzing omdat het geen ref parameter is
  • CS8167: Kan niet retourneren door te verwijzen naar een lid van de parameter omdat het geen ref of out parameter is
  • CS8168: Kan niet lokaal retourneren op basis van verwijzing omdat het geen ref lokaal is
  • CS8169: Kan geen lid van een lokale variabele retourneren, omdat deze geen lokale verwijzing is
  • CS8196: Verwijzing naar een impliciet getypte variabele is niet toegestaan in dezelfde argumentenlijst.
  • CS8325: 'await' kan niet worden gebruikt in een expressie die een ref voorwaardelijke operator bevat
  • CS8326: Beide waarden voor voorwaardelijke operator moeten verw-waarden zijn of geen van beide een verw-waarde zijn
  • CS8327: De expressie moet van het juiste type zijn om overeen te komen met de alternatieve verw-waarde
  • CS8329: Kan variabele niet gebruiken als een ref of out andere waarde omdat het een alleen-lezen variabele is
  • CS8330: Leden van een variabele kunnen niet worden gebruikt als een ref waarde omdat out het een alleen-lezen variabele is
  • CS8331: Kan niet toewijzen aan een variabele of deze gebruiken als de rechterkant van een ref toewijzing omdat het een alleen-lezen variabele is
  • CS8332: Kan niet toewijzen aan een lid van een variabele of deze gebruiken als de rechterkant van een ref toewijzing omdat het een alleen-lezen variabele is
  • CS8337: De eerste parameter van eenref extensiemethode moet een waardetype of een algemeen type zijn dat is beperkt tot de struct.
  • CS8338: De eerste parameter 'in' of 'ref readonly' van de extensiemethode moet een concreet (niet-algemeen) waardetype zijn.
  • CS8351: Vertakkingen van een ref voorwaardelijke operator kunnen niet verwijzen naar variabelen met incompatibele declaratiebereiken
  • CS8373: De linkerkant van een ref toewijzing moet een verw-variabele zijn.
  • CS8374: Kan bron niet ref-assign heeft een smaller escape-bereik dan de bestemming.
  • CS8388: Een out variabele kan niet worden gedeclareerd als een lokale verw
  • CS8977: Kan 'ref', 'in' of 'out' niet gebruiken in de handtekening van een methode die is toegeschreven aan UnmanagedCallersOnly.
  • CS9072: Een deconstructievariabele kan niet worden gedeclareerd als een lokale ref
  • CS9077: Kan een parameter niet retourneren via een ref parameter; deze kan alleen worden geretourneerd in een retourinstructie
  • CS9078: Kan niet retourneren door te verwijzen naar een lid van de parameter via een ref parameter; deze kan alleen worden geretourneerd in een retourinstructie
  • CS9079: Kan niet opnieuw toewijzen omdat de bron alleen kan ontsnappen aan de huidige methode via een retourinstructie.
  • CS9096: Kan niet verw-toewijzen omdat de bron een groter escapebereik heeft dan het doel dat toewijzing via de bron van waarden met smallere escapebereiken toestaat dan de bestemming.
  • CS9101: UnscopedRefAttribute kan alleen worden toegepast op methoden en eigenschappen van struct- of virtuele interface-exemplaren en kan niet worden toegepast op constructors of init-only leden.
  • CS9102: UnscopedRefAttribute kan niet worden toegepast op een interface-implementatie omdat het geïmplementeerde lid dit kenmerk niet heeft.
  • CS9104: Een using instructieresource van het type kan niet worden gebruikt in asynchrone methoden of asynchrone lambda-expressies.
  • CS9190: readonly modifier moet worden opgegeven na ref.
  • CS9199: Een ref readonly parameter kan het out-kenmerk niet hebben.

De volgende waarschuwingen worden gegenereerd wanneer verwijzingsvariabelen onjuist worden gebruikt:

  • CS9085: Deze verw-toewijzingsvariabele, maar de bestemming heeft een smaller escape-bereik dan de bron.
  • CS9086: De vertakkingen van de ref voorwaardelijke operator verwijzen naar variabelen met incompatibele declaratiebereiken
  • CS9087: Hiermee wordt een parameter geretourneerd op basis van verwijzing, maar het is geen ref parameter
  • CS9089: Dit retourneert door te verwijzen naar een lid van de parameter die geen ref of out parameter is
  • CS9091: Dit retourneert lokaal op basis van verwijzing, maar het is geen ref local
  • CS9092: Hiermee wordt een lokaal lid geretourneerd, maar het is geen lokale referentie
  • CS9093: Deze ref-assigns, maar bron kan alleen ontsnappen aan de huidige methode via een retourinstructie.
  • CS9094: Hiermee wordt een parameter geretourneerd door middel van een ref parameter, maar deze kan alleen veilig worden geretourneerd in een retourinstructie
  • CS9095: Dit retourneert door te verwijzen naar een lid van de parameter via een ref parameter, maar kan alleen veilig worden geretourneerd in een retourinstructie
  • CS9097: Deze verw-toewijzingen, maar bron heeft een breder escapebereik dan het doel dat toewijzing via het doel van waarden met smallere escapebereiken dan de bron toestaat.
  • CS9191: De ref wijzigingsfunctie voor het argument dat overeenkomt met in de parameter is gelijk aan in. Overweeg in plaats daarvan te gebruiken in .
  • CS9192: Argument moet worden doorgegeven met ref of in trefwoord.
  • CS9193: Argument moet een variabele zijn omdat het wordt doorgegeven aan een ref readonly parameter
  • CS9195: Argument moet worden doorgegeven met het in trefwoord
  • CS9196: Verwijzingstypeaanpassing van parameter komt niet overeen met de bijbehorende parameter in overschreven of geïmplementeerd lid.
  • CS9197: Verwijzingstypeaanpassing van parameter komt niet overeen met de bijbehorende parameter in verborgen lid.
  • CS9198: Verwijzingstypeaanpassing van parameter komt niet overeen met de bijbehorende parameter in het doel.
  • CS9200: Er wordt een standaardwaarde opgegeven voor ref readonly de parameter, maar ref readonly mag alleen worden gebruikt voor verwijzingen. Overweeg de parameter te declareren als in.
  • CS9201: Het veld Verw moet worden toegewezen voordat u deze gebruikt.
  • CS9265: Veld wordt nooit ref-assigned aan en heeft altijd de standaardwaarde (null-verwijzing)

Deze fouten en waarschuwingen volgen deze thema's:

In dit artikel wordt de termverwijzingsvariabele gebruikt als algemene term voor een parameter die is gedeclareerd met een van de in, ref readonly, refof out modifiers, of een ref lokale variabele, een ref veld in een ref structof een ref return. Een verwijzingsvariabele verwijst naar een andere variabele, de zogenaamde referent.

Onjuiste syntaxis

Deze fouten geven aan dat u onjuiste syntaxis gebruikt met betrekking tot verwijzingsvariabelen:

  • CS8373: De linkerkant van een ref toewijzing moet een verw-variabele zijn.
  • CS8388: Een out variabele kan niet worden gedeclareerd als een lokale ref.
  • CS9190: readonly modifier moet worden opgegeven na ref.

U kunt de fout corrigeren met een van deze wijzigingen:

  • De linkeroperand van een = ref operator moet een verwijzingsvariabele zijn. Zie referentievariabelen voor meer informatie over de juiste syntaxis.
  • De parameteraanpassing ref readonly moet in die volgorde staan. readonly ref is geen juridische parameter modifier. De volgorde van de woorden wijzigen.
  • Een lokale variabele kan niet worden gedeclareerd als out. Als u een lokale referentievariabele wilt declareren, gebruikt u ref.

Beperkingen voor referentievariabelen

De volgende fouten geven aan dat een verwijzingsvariabele niet kan worden gebruikt als u er een hebt:

  • CS0631: ref en out zijn niet geldig in deze context
  • CS0767: Kan de interface met de opgegeven typeparameters niet overnemen, omdat deze methode overbelastingen veroorzaakt die alleen ref verschillen op en out
  • CS1623: Iterators kunnen geen of in out parameters hebben ref
  • CS1741: A ref of out parameter kan geen standaardwaarde hebben
  • CS1939: Kan de bereikvariabele niet doorgeven als een out of ref parameter
  • CS1988: Async-methoden kunnen geen of out in parameters hebben ref
  • CS7084: Een Windows Runtime-gebeurtenis kan niet worden doorgegeven als een out of ref parameter.
  • CS8196: Verwijzing naar een impliciet getypte out variabele is niet toegestaan in dezelfde argumentenlijst.
  • CS8325: 'await' kan niet worden gebruikt in een expressie die een ref voorwaardelijke operator bevat
  • CS8326: Beide waarden voor voorwaardelijke operator moeten verw-waarden zijn of geen van beide een verw-waarde zijn
  • CS8327: De expressie moet van het juiste type zijn om overeen te komen met de alternatieve verw-waarde
  • CS8337: De eerste parameter van eenref extensiemethode moet een waardetype of een algemeen type zijn dat is beperkt tot de struct.
  • CS8338: De eerste parameter 'in' of 'ref readonly' van de extensiemethode moet een concreet (niet-algemeen) waardetype zijn.
  • CS8977: Kan 'ref', 'in' of 'out' niet gebruiken in de handtekening van een methode die is toegeschreven aan UnmanagedCallersOnly.
  • CS9072: Een deconstructievariabele kan niet worden gedeclareerd als een lokale ref
  • CS9104: Een using instructieresource van het type kan niet worden gebruikt in asynchrone methoden of asynchrone lambda-expressies.
  • CS9199: Een ref readonly parameter kan het out-kenmerk niet hebben.

De volgende waarschuwingen geven aan dat een verwijzingsvariabele niet mag worden gebruikt en mogelijk onveilig is:

  • CS9196: Verwijzingstypeaanpassing van parameter komt niet overeen met de bijbehorende parameter in overschreven of geïmplementeerd lid.
  • CS9197: Verwijzingstypeaanpassing van parameter komt niet overeen met de bijbehorende parameter in verborgen lid.
  • CS9198: Verwijzingstypeaanpassing van parameter komt niet overeen met de bijbehorende parameter in het doel.
  • CS9200: Er wordt een standaardwaarde opgegeven voor ref readonly de parameter, maar ref readonly mag alleen worden gebruikt voor verwijzingen. Overweeg de parameter te declareren als in.
  • CS9201: Het veld Verw moet worden toegewezen voordat u deze gebruikt.
  • CS9265: Veld wordt nooit ref-assigned aan en heeft altijd de standaardwaarde (null-verwijzing)

Als u de fout wilt oplossen, verwijdert u de verwijzingsvariabele waar deze niet is toegestaan:

  • Verwijder in, refen out parameters van indexeerfuncties, iterators en asynchrone methoden.
  • Verwijder voorwaardelijke ref-expressies (? :) die een await bevatten.
  • Verwijder de ref wijzigingsfunctie uit de eerste parameter van een extensiemethode waarbij dat type geen waardetype is of een algemeen type dat als waardetype is beperkt.
  • Beide of geen [voorwaardelijke operatorexpressies] moeten variabelen zijn ref . Verwijder uit ref de ene expressie of voeg deze toe aan de andere expressie. Als het een ref voorwaardelijke expressie is, moeten beide expressies hetzelfde type zijn.
  • refen out parameters kunnen geen standaardwaarden hebben. Verwijder de ref of out wijzigingsfunctie of verwijder de standaardwaarde.
  • Een impliciet getypte out variabeledeclaratie kan niet ook elders in dezelfde lijst met argumenten worden weergegeven.
  • U kunt geen verwijzingsvariabelen in een using instructie plaatsen in async lambda-expressies voor methoden.
  • De bereikvariabele in een LINQ-query-expressie kan niet worden doorgegeven met verwijzing.
  • U kunt een object niet deconstrueren in referentievariabelen. Vervang de referentievariabelen door waardevariabelen.
  • U kunt niet meerdere interfaces implementeren waarbij overbelasting van methoden alleen op ref en out. De ene interface declareert void M(ref int i) bijvoorbeeld en een andere interface declareert void M(out int i). Een klasse kan beide interfaces niet implementeren omdat de methoden niet kunnen worden onderscheiden. U kunt slechts één van deze interfaces implementeren.
  • Methoden die zijn toegeschreven aan System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute , kunnen geen referentieparameters gebruiken.
  • Een Windows Runtime-gebeurtenis kan niet worden doorgegeven als referentievariabele.
  • Een ref readonly parameter kan er niet op worden System.Runtime.InteropServices.OutAttribute toegepast in externe API.
  • Initialiseer een ref veld in de constructor of als een veld-initialisatiefunctie.

unscoped ref Beperkingen

De unscoped kwalificatie voor ref parameters is op sommige locaties niet toegestaan:

  • CS9101: UnscopedRefAttribute kan alleen worden toegepast op struct-instantie- of virtuele interfacemethoden en -eigenschappen en kan niet worden toegepast op constructors of init-only leden.
  • CS9102: UnscopedRefAttribute kan niet worden toegepast op een interface-implementatie omdat het geïmplementeerde lid dit kenmerk niet heeft.

U moet de unscoped wijzigingsfunctie verwijderen in de parameterdeclaratie die de fout heeft veroorzaakt.

Referentievariabelen vereisen een referent

U moet een variabele opgeven als argument voor een verwijzingsparameter, verwijzingsreparameter of lokale verwijzingstoewijzing:

  • CS0206: Een niet-retournerende eigenschap of indexeerfunctie kan niet worden gebruikt als een out of ref waarde
  • CS1510: A ref of out waarde moet een toewijsbare variabele zijn

Waarschuwingen:

  • CS9191: De ref wijzigingsfunctie voor het argument dat overeenkomt met in de parameter is gelijk aan in. Overweeg in plaats daarvan te gebruiken in .
  • CS9192: Argument moet worden doorgegeven met ref of in trefwoord.
  • CS9193: Argument moet een variabele zijn omdat het wordt doorgegeven aan een ref readonly parameter
  • CS9195: Argument moet worden doorgegeven met het in trefwoord

De compiler verzendt deze fouten wanneer u een expressie gebruikt waarmee een waarde wordt berekend waarin een variabele moet worden gebruikt. U moet het resultaat van die expressie opslaan in een variabele om deze te kunnen gebruiken. Eigenschappen en indexeerfuncties retourneren bijvoorbeeld waarden, niet variabelen. U moet het resultaat opslaan in een variabele en een verwijzing naar die variabele doorgeven.

Schrijfbare referentievariabelen vereisen een beschrijfbare referent

Een beschrijfbare referentievariabele vereist dat de referent ook beschrijfbaar is. De volgende fouten geven aan dat de variabele niet schrijfbaar is:

  • CS0192: Een readonly veld kan niet worden gebruikt als een ref of out waarde (behalve in een constructor)
  • CS0199: Een static readonly veld kan niet worden gebruikt als een ref of out waarde (behalve in een statische constructor)
  • CS1605: Kan variabele niet gebruiken als een ref of out waarde omdat deze alleen-lezen is
  • CS1649: Leden van een readonly veld kunnen niet worden gebruikt als een ref of out waarde (behalve in een constructor)
  • CS1651: Velden van een static readonly veld kunnen niet worden gebruikt als een ref of out waarde (behalve in een statische constructor)
  • CS1655: Kan geen velden van het type gebruiken als een ref of out waarde
  • CS1657: Kan variabele niet gebruiken als een ref of out waarde
  • CS8329: Kan variabele niet gebruiken als een ref of out andere waarde omdat het een alleen-lezen variabele is
  • CS8330: Leden van een variabele kunnen niet worden gebruikt als een ref waarde omdat out het een alleen-lezen variabele is
  • CS8331: Kan niet toewijzen aan een variabele of deze gebruiken als de rechterkant van een ref toewijzing omdat het een alleen-lezen variabele is
  • CS8332: Kan niet toewijzen aan een lid van een variabele of deze gebruiken als de rechterkant van een ref toewijzing omdat het een alleen-lezen variabele is

Voorbeelden van variabelen die niet beschrijfbaar zijn, zijn:

U moet de waarde kopiëren en een verwijzing naar de kopie doorgeven.

Schendingen van de veiligheid van ref

De compiler houdt de veilige context van referents en referentievariabelen bij. De compiler geeft fouten of waarschuwingen in onveilige code op wanneer een verwijzingsvariabele verwijst naar een referentvariabele die niet meer geldig is. De referent moet een veilige context hebben die minstens zo breed is als de veilige context van de referentievariabele. Het schenden van deze veiligheidscontroles betekent dat de referentievariabele toegang heeft tot willekeurig geheugen in plaats van de referentvariabele.

  • CS8166: Kan een parameter niet retourneren op basis van verwijzing omdat het geen ref parameter is
  • CS8167: Kan niet retourneren door te verwijzen naar een lid van de parameter omdat het geen ref of out parameter is
  • CS8168: Kan niet lokaal retourneren op basis van verwijzing omdat het geen ref lokaal is
  • CS8169: Kan geen lid van een lokale variabele retourneren, omdat deze geen lokale verwijzing is
  • CS8345: De eigenschap Veld of automatisch geïmplementeerd kan niet van het type zijn, tenzij het een exemplaarlid van een ref struct.
  • CS8351: Vertakkingen van een ref voorwaardelijke operator kunnen niet verwijzen naar variabelen met incompatibele declaratiebereiken
  • CS8374: Kan bron niet ref-assign heeft een smaller escape-bereik dan de bestemming.
  • CS9077: Kan een parameter niet retourneren via een ref parameter; deze kan alleen worden geretourneerd in een retourinstructie
  • CS9078: Kan niet retourneren door te verwijzen naar een lid van de parameter via een ref parameter; deze kan alleen worden geretourneerd in een retourinstructie
  • CS9079: Kan bron niet opnieuw toewijzen aan de bestemming, omdat de bron alleen kan ontsnappen aan de huidige methode via een retourinstructie.
  • CS9096: Kan bron niet aan doel toewijzen omdat de bron een groter escapebereik heeft dan het doel, waardoor toewijzing via het doel van waarden met beperktere escapebereiken dan bron mogelijk is.

Waarschuwingen:

  • CS9085: Deze verw wijst bron toe aan de bestemming, maar de bron heeft een smaller escape-bereik dan de bestemming.
  • CS9086: De vertakkingen van de voorwaardelijke verw-operator verwijzen naar variabelen met incompatibele declaratiebereiken
  • CS9087: Hiermee wordt een parameter geretourneerd op basis van verwijzing, maar het is geen ref parameter
  • CS9089: Dit retourneert door te verwijzen naar een lid van de parameter die geen ref of out parameter is
  • CS9091: Dit retourneert lokaal op basis van verwijzing, maar het is geen ref local
  • CS9092: Hiermee wordt een lokaal lid geretourneerd, maar het is geen lokale referentie
  • CS9093: Deze ref-assigns source to destination, but source can only escape the current method through a return statement.
  • CS9094: Hiermee wordt een parameter geretourneerd door middel van een ref parameter, maar deze kan alleen veilig worden geretourneerd in een retourinstructie
  • CS9095: Dit retourneert door te verwijzen naar een lid van de parameter via een ref parameter, maar kan alleen veilig worden geretourneerd in een retourinstructie
  • CS9097: Met deze verw-toewijzingsbron wordt een bron toegewezen aan de bestemming, maar de bron heeft een groter escape-bereik dan het doel dat toewijzing via het doel van waarden met smallere escapebereiken dan de bron toestaat.

De compiler maakt gebruik van statische analyse om te bepalen of de referent geldig is op alle punten waar de referentievariabele kan worden gebruikt. U moet code herstructureren zodat de referent geldig blijft op alle locaties waar de referentievariabele ernaar kan verwijzen. Zie de C#-standaard voor ref-veilige contexten voor meer informatie over de regels voor refveiligheid.