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 eenref
ofout
waarde (behalve in een constructor) - CS0199: Een
static readonly
veld kan niet worden gebruikt als eenref
ofout
waarde (behalve in een statische constructor) - CS0206: Een niet-retournerende eigenschap of indexeerfunctie kan niet worden gebruikt als een
out
ofref
waarde - CS0631:
ref
enout
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 enout
- CS1510: A
ref
ofout
waarde moet een toewijsbare variabele zijn - CS1605: Kan variabele niet gebruiken als een
ref
ofout
waarde omdat deze alleen-lezen is - CS1623: Iterators kunnen geen of
in
out
parameters hebbenref
- CS1649: Leden van een
readonly
veld kunnen niet worden gebruikt als eenref
ofout
waarde (behalve in een constructor) - CS1651: Velden van een statisch alleen-lezen veld kunnen niet worden gebruikt als een
ref
ofout
waarde (behalve in een statische constructor) - CS1655: Kan geen velden van het type gebruiken als een
ref
ofout
waarde - CS1657: Kan variabele niet gebruiken als een
ref
ofout
waarde - CS1741: A
ref
ofout
parameter kan geen standaardwaarde hebben - CS1939: Kan de bereikvariabele niet doorgeven als een
out
ofref
parameter - CS1988: Async-methoden kunnen geen of
out
in
parameters hebbenref
- CS7084: Een Windows Runtime-gebeurtenis kan niet worden doorgegeven als een
out
ofref
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
ofout
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 eenref
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
ofout
andere waarde omdat het een alleen-lezen variabele is - CS8330: Leden van een variabele kunnen niet worden gebruikt als een
ref
waarde omdatout
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 een
ref
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 naref
. - 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
ofout
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 metin
de parameter is gelijk aanin
. Overweeg in plaats daarvan te gebruikenin
. - CS9192: Argument moet worden doorgegeven met
ref
ofin
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, maarref readonly
mag alleen worden gebruikt voor verwijzingen. Overweeg de parameter te declareren alsin
. - 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:
- Onjuiste syntaxis: de syntaxis van uw declaratie of gebruik is ongeldig.
- Taalconstructies waarbij
ref
variabelen niet geldig zijn: sommige C#-idiomen staan geen variabelen toe. Dit komt meestal doordat refveiligheidsanalyse niet betrouwbaar kan worden uitgevoerd. - Waarde-expressie die wordt gebruikt waar een verwijzingsvariabele nodig is: de expressie die als referentievariabele wordt gebruikt, moet een variabele zijn, niet een waardeexpressie.
- Schrijfbare referentievariabelen die verwijzen naar alleen-lezen variabelen: een verwijzing naar een alleen-lezen variabele kan niet worden doorgegeven door schrijfbare verwijzing.
- schendingen van ref-veiligheid: een referentievariabele kan niet verwijzen naar een variabele met een beperktere context. Dat betekent dat de verwijzingsvariabele naar ongeldig geheugen kan verwijzen.
In dit artikel wordt de termverwijzingsvariabele gebruikt als algemene term voor een parameter die is gedeclareerd met een van de in
, ref readonly
, ref
of out
modifiers, of een ref
lokale variabele, een ref
veld in een ref struct
of 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 naref
.
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 uref
.
Beperkingen voor referentievariabelen
De volgende fouten geven aan dat een verwijzingsvariabele niet kan worden gebruikt als u er een hebt:
- CS0631:
ref
enout
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 enout
- CS1623: Iterators kunnen geen of
in
out
parameters hebbenref
- CS1741: A
ref
ofout
parameter kan geen standaardwaarde hebben - CS1939: Kan de bereikvariabele niet doorgeven als een
out
ofref
parameter - CS1988: Async-methoden kunnen geen of
out
in
parameters hebbenref
- CS7084: Een Windows Runtime-gebeurtenis kan niet worden doorgegeven als een
out
ofref
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 een
ref
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, maarref readonly
mag alleen worden gebruikt voor verwijzingen. Overweeg de parameter te declareren alsin
. - 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
,ref
enout
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 uitref
de ene expressie of voeg deze toe aan de andere expressie. Als het eenref
voorwaardelijke expressie is, moeten beide expressies hetzelfde type zijn. ref
enout
parameters kunnen geen standaardwaarden hebben. Verwijder deref
ofout
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 inasync
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
enout
. De ene interface declareertvoid M(ref int i)
bijvoorbeeld en een andere interface declareertvoid 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
ofref
waarde - CS1510: A
ref
ofout
waarde moet een toewijsbare variabele zijn
Waarschuwingen:
- CS9191: De
ref
wijzigingsfunctie voor het argument dat overeenkomt metin
de parameter is gelijk aanin
. Overweeg in plaats daarvan te gebruikenin
. - CS9192: Argument moet worden doorgegeven met
ref
ofin
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 eenref
ofout
waarde (behalve in een constructor) - CS0199: Een
static readonly
veld kan niet worden gebruikt als eenref
ofout
waarde (behalve in een statische constructor) - CS1605: Kan variabele niet gebruiken als een
ref
ofout
waarde omdat deze alleen-lezen is - CS1649: Leden van een
readonly
veld kunnen niet worden gebruikt als eenref
ofout
waarde (behalve in een constructor) - CS1651: Velden van een
static readonly
veld kunnen niet worden gebruikt als eenref
ofout
waarde (behalve in een statische constructor) - CS1655: Kan geen velden van het type gebruiken als een
ref
ofout
waarde - CS1657: Kan variabele niet gebruiken als een
ref
ofout
waarde - CS8329: Kan variabele niet gebruiken als een
ref
ofout
andere waarde omdat het een alleen-lezen variabele is - CS8330: Leden van een variabele kunnen niet worden gebruikt als een
ref
waarde omdatout
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:
- alleen-lezen velden, zowel instantie- als statische velden.
- Leden van
readonly
velden. - De
this
variabele. - De foreach-iteratievariabele
- Een met variabele of een vaste variabele.
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
ofout
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
ofout
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.