Dela via


Lösa fel och varningar i osäkra kodkonstruktioner

Den här artikeln beskriver följande kompilatorfel:

  • CS0193: Operatorn * eller -> måste tillämpas på en datapekare
  • CS0196: En pekare måste indexeras med endast ett värde
  • CS0208: Det går inte att ta adressen till, hämta storleken på eller deklarera en pekare till en hanterad typ ("typ")
  • CS0209: Typen av lokal deklarerad i en fast instruktion måste vara en pekartyp
  • CS0210: Du måste ange en initierare i en fast deklaration eller using instruktionsdeklaration
  • CS0211: Det går inte att ta adressen till det angivna uttrycket
  • CS0212: Du kan bara ta adressen till ett ofixerat uttryck i en initiator för fast instruktion
  • CS0213: Du kan inte använda fast instruktion för att erhålla adressen till ett redan fixerat uttryck
  • CS0214: Pekare och buffertar med fast storlek kan endast användas i en osäker kontext
  • CS0227: Osäker kod kan bara visas om kompilering med /osäker
  • CS0233: "identifierare" har ingen fördefinierad storlek, därför kan storleken endast användas i en osäker kontext
  • CS0242: Åtgärden i fråga är odefinierad vid tomrumspekare
  • CS0244: Varken 'is' eller 'as' är giltig på pekartyper
  • CS0254: Den högra sidan av en fast instruktionstilldelning kanske inte är ett cast-uttryck
  • CS0459: Det går inte att ta adressen till en skrivskyddad lokal variabel
  • CS0821: Implicit typade lokala variabler kan inte fixeras
  • CS1641: Ett buffertfält med fast storlek måste ha matrisstorleksspecificeraren efter fältnamnet
  • CS1642: Buffertfält med fast storlek kan bara vara medlemmar i structs.
  • CS1656: Det går inte att tilldela till 'variabel' eftersom det är en 'skrivskyddad variabel'
  • CS1663: Bufferttypen fast storlek måste vara något av följande: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong eller float, double
  • CS1665: Buffertar med fast storlek måste ha en längd som är större än noll
  • CS1666: Du kan inte använda buffertar med fast storlek som finns i oberättade uttryck. Prova att använda den fasta instruktionen.
  • CS1708: Buffertar med fast storlek kan endast nås via lokala variabler eller fältvariabler
  • CS1716: Använd inte attributet .System.Runtime.CompilerServices.FixedBuffer Använd den fasta fältmodifieraren i stället.
  • CS1919: Osäker typ av "typnamn" kan inte användas vid skapande av objekt.
  • CS4004: Det går inte await att i en osäker kontext
  • CS8812: Det går inte att konvertera &Method gruppen till icke-funktionspekartyp.
  • CS9123: Operatorn '&' ska inte användas på parametrar eller lokala variabler i asynkrona metoder.

Pekaroperationer och dereferensering

  • CS0193: Operatorn * eller -> måste tillämpas på en datapekare
  • CS0196: En pekare måste indexeras med endast ett värde
  • CS0242: Åtgärden i fråga är odefinierad vid tomrumspekare

Om du vill använda pekaråtgärder korrekt följer du reglerna för dereferencing, indexering och aritmetiska åtgärder. Mer information finns i Pekartyper och funktionspekare.

  • Använd operatorn * eller -> endast på datapekare (CS0193). Använd inte dessa operatorer med icke-pointer-typer eller funktionspekare. Funktionspekare kan inte derefereras i C#, till skillnad från i C/C++.
  • Indexpekare med endast ett värde (CS0196). Flerdimensionell indexering stöds inte vid pekare.
  • Undvik åtgärder som är odefinierade vid tomrumspekare (CS0242). Öka till exempel inte en tomrumspekare eftersom kompilatorn inte vet storleken på de data som pekas på.

Pekartyper och hanterade typer

  • CS0208: Det går inte att ta adressen till, hämta storleken på eller deklarera en pekare till en hanterad typ ("typ")
  • CS0233: "identifierare" har ingen fördefinierad storlek, därför kan storleken endast användas i en osäker kontext

Om du vill arbeta med pekare och operatorn sizeof korrekt använder du ohanterade typer och rätt kontexter. Mer information finns i Ohanterade typer och operatornsizeof.

  • Använd endast pekare med ohanterade typer (CS0208). Ta inte adressen till, beräkna storleken på eller deklarera pekare till hanterade typer. Hanterade typer inkluderar referenstyper och structs som innehåller fält eller egenskaper för referenstyp.
  • Använd operatorn sizeof i en unsafe kontext när du arbetar med typer vars storlek inte är en kompileringskonstant (CS0233).

Fasta buffertar

  • CS0209: Typen av lokal deklarerad i en fast instruktion måste vara en pekartyp
  • CS0210: Du måste ange en initierare i en fast eller using satsdeklaration
  • CS0211: Det går inte att ta adressen till det angivna uttrycket
  • CS0212: Du kan bara ta adressen till ett ofixerat uttryck i en initiator för fast instruktion
  • CS0213: Du kan inte använda den fasta instruktionen för att ta adressen till ett redan fast uttryck
  • CS0254: Den högra sidan av en fast instruktionstilldelning kanske inte är ett cast-uttryck
  • CS0459: Det går inte att ta adressen till en skrivskyddad lokal variabel
  • CS0821: Implicit deklarerade lokala variabler kan inte fixeras
  • CS1656: Det går inte att tilldela till variabeln eftersom den är en skrivskyddad variabeltyp

Dessa fel uppstår när du använder -instruktionenfixed felaktigt. Instruktionen fixed hindrar skräpinsamlaren från att flytta en flyttbar variabel och deklarerar en pekare till variabeln. Mer information finns i Osäker kod och pekare.

Så här använder du instruktionen fixed korrekt:

  • Deklarera variabeln som en pekartyp (CS0209).
  • Ange en initierare i deklarationen av fixed-satsen (CS0210).
  • Ta endast adressen till giltiga uttryck: fält, lokala variabler och indirekt pekare (CS0211). Ta inte adressen av beräknade uttryck som summan av två variabler.
  • Använd adressoperatorn endast för ofixerade uttryck inom satssinitialiserare fixed (CS0212).
  • Använd inte en fixed instruktion för redan fasta uttryck (CS0213). Lokala variabler och parametrar i en unsafe metod är redan fasta i stacken.
  • Använd inte cast-uttryck till höger i en fixed instruktionstilldelning (CS0254).
  • Ta inte adressen till skrivskyddade lokala variabler (CS0459). Variabler i foreach loopar, using satser och fixed satser är skrivskyddade.
  • Använd explicita typer i stället för var i fixed -instruktioner (CS0821).
  • Tilldela inte variabler i kontexter som endast kan läsas, som foreach loopar, using uttryck eller fixed uttryck (CS1656).

Begränsningar för osäkra kontexter

  • CS0214: Pekare och buffertar med fast storlek kan endast användas i en osäker kontext
  • CS0227: Osäker kod kan bara visas om kompilering med /osäker
  • CS0244: Varken "är" eller "som" är giltigt för pekartyper
  • CS1919: Osäker typ av "typnamn" kan inte användas vid skapande av objekt
  • CS4004: Det går inte att vänta i en osäker kontext
  • CS9123: Operatorn '&' bör inte användas på parametrar eller lokala variabler i asynkrona metoder

Dessa fel uppstår när du använder osäkra kodkonstruktioner utan rätt osäker kontext eller när du försöker utföra åtgärder som inte tillåts i osäker kod. Mer information finns i Osäker kod och pekare och nyckelordetunsafe.

Så här använder du osäker kod på rätt sätt:

  • Markera metoder, typer eller kodblock som använder pekare eller buffertar med fast storlek med nyckelordet unsafe (CS0214).
  • Aktivera kompileringsalternativet AllowUnsafeBlocks i projektinställningarna när du använder nyckelordet unsafe (CS0227).
  • Använd inte operatorerna is eller as med pekartyper (CS0244). Dessa typtestoperatorer är inte giltiga för pekare.
  • Använd inte operatorn new för att skapa pekartypsinstanser (CS1919). Om du vill skapa objekt i ohanterat minne använder du interop för att anropa interna metoder som returnerar pekare.
  • Håll osäker kod separat från asynkron kod (CS4004). Skapa separata metoder för osäkra åtgärder och anropa dem från asynkrona metoder.
  • Använd inte operatorns adress (&) för parametrar eller lokala variabler i asynkrona metoder (CS9123). Variabeln kanske inte finns när asynkroniseringsåtgärden är klar.

Buffertar med fast storlek

  • CS1641: Ett buffertfält med fast storlek måste ha matrisstorleksspecificeraren efter fältnamnet
  • CS1642: Buffertfält med fast storlek får endast vara medlemmar i structs
  • CS1663: Bufferttypen fast storlek måste vara något av följande: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float eller double
  • CS1665: Buffertar med fast storlek måste ha en längd som är större än noll
  • CS1666: Du kan inte använda buffertar med fast storlek som finns i ofixerade uttryck. Prova att använda fixed-satsen
  • CS1708: Buffertar med fast storlek kan endast nås via lokala variabler eller fältvariabler
  • CS1716: Använd inte attributet System.Runtime.CompilerServices.FixedBuffer. Använd den fasta fältmodifieraren i stället

Dessa fel uppstår när du arbetar med buffertar med fast storlek. Buffertar med fast storlek är matriser som bäddas in direkt i structs och används främst för interop-scenarier. Mer information finns i Buffertar med fast storlek.

Så här deklarerar och använder du buffertar med fast storlek på rätt sätt:

  • Ange matrisstorleken efter fältnamnet med hjälp av en positiv heltalskonstant (CS1641, CS1665).
  • Deklarera buffertar med fast storlek endast i structs, inte i klasser (CS1642). Använd en vanlig matris om du behöver fältet i en klass.
  • Använd någon av de elementtyper som stöds: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, floateller double (CS1663).
  • Använd en fixed instruktion för att fästa den innehållande structen innan du kommer åt bufferten (CS1666).
  • Få åtkomst till buffertar med fast storlek endast via lokala variabler eller fält, inte via mellanliggande uttryck (CS1708).
  • fixed Använd fältmodifieraren i stället för System.Runtime.CompilerServices.FixedBuffer attributet (CS1716).

Funktionspekare

  • CS8812: Det går inte att konvertera &Method gruppen till icke-funktionspekartyp

För att erhålla en funktionspekare, använd adress-operatorn med en explicit typkonvertering till funktionspekartyp. Använd inte adressoperatorn & för att tilldela metodgrupper till void* eller andra typer av pekare som inte är funktioner. Mer information finns i Funktionspekare.