Delen via


Fouten en waarschuwingen in onveilige codeconstructies oplossen

In dit artikel worden de volgende compilerfouten behandeld:

  • CS0193: De operator * of -> moet worden toegepast op een gegevenspointer
  • CS0196: Een aanwijzer moet worden geïndexeerd met slechts één waarde
  • nl-NL: CS0208: Kan het adres niet ophalen, de grootte niet verkrijgen, of geen aanwijzer naar een beheerd type declareren ('type')
  • CS0209: Het type lokaal gedeclareerd in een vaste instructie moet een aanwijzertype zijn
  • CS0210: U moet een initialisatiefunctie opgeven in een vaste of using instructiedeclaratie
  • CS0211: Kan het adres van de gegeven expressie niet nemen
  • CS0212: U kunt alleen het adres van een niet-gefunde expressie binnen een fixed-statement-initialisator gebruiken
  • CS0213: U kunt de vaste instructie niet gebruiken om het adres van een reeds vaste expressie te gebruiken
  • CS0214: Aanwijzers en buffers met vaste grootte kunnen alleen worden gebruikt in een onveilige context
  • CS0227: Onveilige code kan alleen worden gebruikt als er met /unsafe gecompileerd wordt
  • CS0233: 'id' heeft geen vooraf gedefinieerde grootte, daarom kan de grootte alleen worden gebruikt in een onveilige context
  • CS0242: De betreffende bewerking is niet gedefinieerd voor void-pointers
  • CS0244: Noch 'is' noch 'as' is geldig voor aanwijzertypen
  • CS0254: De rechterkant van een fixed-statement-toewijzing mag geen cast-expressie zijn
  • CS0459: Kan het adres van een alleen-lezen lokale variabele niet gebruiken
  • CS0821: Impliciet getypte lokale variabelen kunnen niet worden vastgezet
  • CS1641: Een bufferveld met een vaste grootte moet de matrixgrootteaanduiding hebben na de veldnaam
  • CS1642: Buffervelden met vaste grootte mogen alleen lid zijn van structs.
  • CS1656: Kan niet toewijzen aan 'variabele' omdat het een 'alleen-lezen variabel type' is
  • CS1663: Buffertype vaste grootte moet een van de volgende zijn: bool, byte, short, int, longchar, , sbyte, ushort, uint, , of ulongfloatdouble
  • CS1665: Buffers met vaste grootte moeten een lengte hebben die groter is dan nul
  • CS1666: U kunt geen buffers met vaste grootte gebruiken die zijn opgenomen in niet-opgeloste expressies. Probeer de vaste instructie te gebruiken.
  • CS1708: Buffers met een vaste grootte kunnen alleen toegankelijk zijn via lokale variabelen of velden
  • CS1716: Gebruik het kenmerk 'System.Runtime.CompilerServices.FixedBuffer' niet. Gebruik in plaats daarvan de 'fixed' veldmodifier.
  • CS1919: Onveilig type 'typenaam' kan niet worden gebruikt bij het maken van objecten.
  • CS4004: Kan niet await in een onveilige context
  • CS8812: Kan groep niet converteren &Method naar niet-functie-pointertype.
  • CS9049: Een vast veld mag geen referentieveld zijn.
  • CS9123: De operator '&' mag niet worden gebruikt voor parameters of lokale variabelen in asynchrone methoden.

Pointerbewerkingen en dereferencing

  • CS0193: De * of -> operator moet worden toegepast op een gegevenspointer
  • CS0196: Een aanwijzer moet worden geïndexeerd met slechts één waarde
  • CS0242: De betreffende bewerking is niet gedefinieerd op void-aanwijzers

Als u aanwijzerbewerkingen correct wilt gebruiken, volgt u de regels voor het deducteren, indexeren en rekenkundige bewerkingen. Zie Aanwijzertypen en Functie-aanwijzers voor meer informatie.

  • Pas alleen de * of -> operator toe op gegevenspointers (CS0193). Gebruik deze operators niet met niet-aanwijzertypen of functiepointers. In tegenstelling tot in C/C++ kunt u functiepointers in C# niet dereferencen.
  • Indexpointers met slechts één waarde (CS0196). Multidimensionale indexering wordt niet ondersteund op aanwijzers.
  • Vermijd bewerkingen die niet zijn gedefinieerd voor ongeldige aanwijzers (CS0242). Verhoog bijvoorbeeld geen void-aanwijzer omdat de compiler de grootte van de gegevens waarnaar het verwijst niet weet.

Aanwijzertypen en beheerde typen

  • CS0208: Kan het adres van een beheerd type ('type') niet verkrijgen, de grootte ervan niet bepalen, of een pointer ernaar niet declareren
  • CS0233: 'id' heeft geen vooraf gedefinieerde grootte, daarom kan de grootte alleen worden gebruikt in een onveilige context

Als u met aanwijzers en de sizeof operator correct wilt werken, gebruikt u niet-beheerde typen en juiste contexten. Zie Niet-beheerde typen en de sizeof operator voor meer informatie.

  • Gebruik alleen aanwijzers met niet-beheerde typen (CS0208). Neem niet het adres van, haal niet de grootte van, of declareer geen aanwijzers naar beheerde typen. Beheerde typen bevatten verwijzingstypen en structs die velden of eigenschappen van het verwijzingstype bevatten.
  • Gebruik de operator in een sizeof context bij het werken met typen waarvan de unsafe grootte geen compilatieconstante is (CS0233).

Vaste buffers

  • CS0209: Het type lokaal gedeclareerd in een vaste instructie moet een aanwijzertype zijn
  • CS0210: U moet een initialisatiefunctie opgeven in een vaste of using instructiedeclaratie
  • CS0211: Kan het adres van de gegeven expressie niet gebruiken
  • CS0212: U kunt alleen het adres van een niet-gefixeerde expressie binnen een vast-instructie-initialisator gebruiken
  • CS0213: U kunt de vaste instructie niet gebruiken om het adres van een reeds vaste expressie te gebruiken
  • CS0254: De rechterkant van een toewijzing van een vaste instructie mag geen cast-expressie zijn
  • CS0459: Kan het adres van een alleen-lezen lokale variabele niet gebruiken
  • CS0821: Impliciet getypte lokale variabelen kunnen niet worden vastgezet
  • CS1656: Kan niet toewijzen aan 'variabele' omdat het een 'alleen-lezen variabel type' is

Deze fouten treden op wanneer u de fixed instructie onjuist gebruikt. Met fixed de instructie voorkomt u dat de garbagecollector een verplaatsbare variabele verplaatst en een aanwijzer naar die variabele declareert. Zie Onveilige code en aanwijzers voor meer informatie.

Volg de volgende stappen om de fixed-instructie correct te gebruiken:

  • Declareer de variabele als een aanwijzertype (CS0209).
  • Geef een initialisatiefunctie op in de fixed instructiedeclaratie (CS0210).
  • Neem alleen het adres van geldige expressies: velden, lokale variabelen en pointer indirectie (CS0211). Neem niet het adres van berekende expressies, zoals de som van twee variabelen.
  • Gebruik het adres van de operator voor niet-opgeloste expressies alleen binnen de initialisatiefunctie van de fixed instructie (CS0212).
  • Gebruik geen fixed verklaring voor reeds vastgelegde uitdrukkingen (CS0213). Lokale variabelen en parameters in een unsafe methode zijn al vastgezet op de stack.
  • Gebruik geen cast-expressies aan de rechterkant van een fixed instructietoewijzing (CS0254).
  • Gebruik niet het adres voor alleen-lezen lokale variabelen (CS0459). Variabelen in foreach lussen, using instructies en fixed instructies zijn alleen-lezen.
  • Gebruik expliciete typen in plaats van var in fixed instructies (CS0821).
  • Wijs niet toe aan variabelen in alleen-lezencontexten, zoals foreach lussen, using instructies of fixed instructies (CS1656).

Onveilige contextbeperkingen

  • CS0214: Aanwijzers en buffers met vaste grootte kunnen alleen worden gebruikt in een onveilige context
  • CS0227: Onveilige code mag alleen verschijnen als gecompileerd wordt met /unsafe
  • CS0244: 'is' noch 'as' is geldig voor aanwijzertypen
  • CS1919: Onveilig type 'typenaam' kan niet worden gebruikt bij het maken van objecten
  • CS4004: Kan niet wachten in een onveilige context
  • CS9123: De operator '&' mag niet worden gebruikt voor parameters of lokale variabelen in asynchrone methoden

Deze fouten treden op wanneer u onveilige codeconstructies gebruikt zonder de juiste onveilige context of wanneer u bewerkingen probeert uit te voeren die niet zijn toegestaan in onveilige code. Zie Onveilige code en aanwijzers en het unsafe trefwoord voor meer informatie.

Onveilige code correct gebruiken:

  • Methoden, typen of codeblokken markeren die gebruikmaken van aanwijzers of buffers met vaste grootte met behulp van het unsafe trefwoord (CS0214).
  • Schakel de optie AllowUnsafeBlocks compiler in uw projectinstellingen in wanneer u het unsafe trefwoord (CS0227) gebruikt.
  • Gebruik de operators is of as niet met aanwijzertypen (CS0244). Deze operatoren voor typencontrole zijn niet geldig voor pointers.
  • Gebruik de new operator niet om exemplaren van het type aanwijzer te maken (CS1919). Als u objecten in onbeheerd geheugen wilt maken, gebruikt u interop om systeemeigen methoden aan te roepen die pointers retourneren.
  • Onveilige code gescheiden houden van asynchrone code (CS4004). Maak afzonderlijke methoden voor onveilige bewerkingen en roep deze aan vanuit asynchrone methoden.
  • Gebruik het adres van de operator (&) niet voor parameters of lokale variabelen in asynchrone methoden (CS9123). De variabele bestaat mogelijk niet wanneer de asynchrone bewerking is voltooid.

Buffers met vaste grootte

  • CS1641: Een bufferveld met een vaste grootte moet de matrixgrootteaanduiding hebben na de veldnaam
  • CS1642: Buffervelden met vaste grootte mogen alleen lid zijn van structs
  • CS1663: Buffertype vaste grootte moet een van de volgende zijn: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float of double
  • CS1665: Buffers met vaste grootte moeten een lengte hebben die groter is dan nul
  • CS1666: U kunt geen buffers met vaste grootte gebruiken die zijn opgenomen in niet-opgeloste expressies. Probeer de vaste instructie te gebruiken
  • CS1708: Buffers met vaste grootte kunnen alleen worden benaderd via lokale variabelen of velden
  • CS1716: Gebruik het kenmerk System.Runtime.CompilerServices.FixedBuffer niet. Gebruik in plaats daarvan de 'vaste' veldaanpassing
  • CS9049: Een vast veld mag geen ref-veld zijn

Deze fouten treden op wanneer u met buffers met vaste grootte werkt. Buffers met vaste grootte zijn matrices die rechtstreeks zijn ingesloten in structs en worden voornamelijk gebruikt voor interop-scenario's. Zie Buffers met vaste grootte voor meer informatie.

Ga als volgende te werk om buffers met vaste grootte correct te declareren en te gebruiken:

  • Geef de matrixgrootte op na de veldnaam met behulp van een positieve geheel getalconstante (CS1641, CS1665).
  • Declareer buffers met vaste grootte alleen in structs, niet in klassen (CS1642). Gebruik een gewone matrix als u het veld in een klasse nodig hebt.
  • Gebruik een van de ondersteunde elementtypen: bool, , byteshort, int, , long, , charsbyteushortuintulong, , of floatdouble (CS1663).
  • Gebruik een fixed instructie om de bevatde struct vast te maken voordat u de buffer opent (CS1666).
  • Toegang tot buffers met vaste grootte alleen via lokale variabelen of velden, niet via tussenliggende expressies (CS1708).
  • Gebruik de fixed veldaanpassing in plaats van het System.Runtime.CompilerServices.FixedBuffer kenmerk (CS1716).
  • Declareer geen buffers met vaste grootte als ref velden (CS9049). Buffers met een vaste grootte moeten waardevelden zijn.

Functieaanwijzers

  • CS8812: Kan groep niet converteren &Method naar niet-functie aanwijzertype

Als u een functieaanwijzer wilt ophalen, gebruikt u het adres van de operator met een expliciete functieaanwijzertype cast. Gebruik het adres van de operator & niet om methodegroepen toe te wijzen aan void* of andere niet-functiepointertypen. Zie Functie-aanwijzers voor meer informatie.