Nem biztonságos kódszerkezetek hibáinak és figyelmeztetéseinek elhárítása

Ez a cikk a következő fordítódiagnosztikát ismerteti:

  • CS0193: A * vagy –> operátort mutatóra kell alkalmazni
  • CS0196: Egy mutatót csak egy érték indexelhet
  • CS0208: Nem lehet felvenni a címet, lekérni a méretet, vagy deklarálni egy mutatót egy felügyelt típusra ('type')
  • CS0209: Az utasításban fixed deklarált helyi típusnak mutatótípusnak kell lennie
  • CS0210: Egy fixed vagy using utasítás deklarációjához inicializálót kell megadnia
  • CS0211: A megadott kifejezés címe nem vehető fel
  • CS0212: Csak egy nem rögzített kifejezés címét veheti fel egy fixed utasítás-inicializálón belül
  • CS0213: Az utasítás nem használható fixed egy már rögzített kifejezés címének megvételére
  • CS0214: Mutatók és rögzített méretű pufferek csak nem biztonságos környezetben használhatók
  • CS0227: A nem biztonságos kód csak akkor jelenhet meg, ha a /unsafe be van állítva fordításkor
  • CS0233: Az "azonosító" nem rendelkezik előre definiált mérettel, ezért a méret csak nem biztonságos környezetben használható
  • CS0242: A kérdéses művelet nincs meghatározva üres mutatókon
  • CS0244: Sem "" sem "isas" nem érvényes a mutatótípusokra
  • CS0254: Előfordulhat, hogy a rögzített utasítás-hozzárendelés jobb oldala nem egy leadott kifejezés
  • CS0459: Nem lehet felvenni az írásvédett helyi változó címét
  • CS0821: Implicit típusú helyi változók nem javíthatók
  • CS1641: A rögzített méretű puffermezőnek a mező neve után a tömbméret-meghatározóval kell rendelkeznie
  • CS1642: A rögzített méretű puffermezők csak a szerkezetek tagjai lehetnek
  • CS1656: Nem rendelhet hozzá 'változóhoz', mert egy 'írásvédett változótípus'
  • CS1663: A rögzített méretű puffertípusnak a következők egyikének kell lennie: bool, byte, , short, int, longchar, sbyte, ushort, uint, ulongvagy floatdouble
  • CS1664: A rögzített méretű puffer hossza "hossz" és "típus" túl nagy
  • CS1665: A rögzített méretű puffereknek nullánál hosszabbnak kell lenniük
  • CS1666: Nem rögzített méretű puffereket nem lehet használni a nem rögzített kifejezésekben. Próbálja meg használni a rögzített utasítást.
  • CS1708: A rögzített méretű pufferek csak helyieken vagy mezőkön keresztül érhetők el
  • CS1716: Ne használjon ""System.Runtime.CompilerServices.FixedBuffer attribútumot. Használja helyette a "rögzített" mezőmódosítót.
  • CS1919: Nem biztonságos típusú "típusnév" nem használható az objektum létrehozásakor
  • CS4004: Nem lehet await biztonságos környezetben
  • CS7092: A rögzített pufferek csak egy dimenzióval rendelkezhetnek.
  • CS8372: Ne használjon "System.Runtime.CompilerServices.FixedBuffer" attribútumot egy tulajdonságon
  • CS8385: A megadott kifejezés nem használható rögzített utasításban
  • CS8500: Lekéri egy felügyelt típus ('type') címét vagy méretét, illetve felügyelt típusra mutató mutatót deklarál
  • CS8812: A &metóduscsoport "metódus" nem függvény típusú mutatótípussá nem konvertálható.
  • CS9049: A rögzített mező nem lehet ref mező.
  • CS9123: A "&" operátor nem használható paramétereken vagy helyi változókon az aszinkron metódusokban.
  • CS9360: Ez a művelet csak nem biztonságos környezetben használható
  • CS9361: stackalloc inicializáló nélküli SkipLocalsInit kifejezés csak nem biztonságos környezetben használható
  • CS9362: A "tag" nem biztonságos környezetben használható, mert ""unsafe jelöléssel rendelkezik
  • CS9363: A "tagot" nem biztonságos környezetben kell használni, mert mutatókkal rendelkezik az aláírásában
  • CS9364: A nem biztonságos tag "member" nem írhatja felül a biztonságos "member"-t
  • CS9365: Az „member” nem biztonságos tag nem valósíthatja meg impliciten a „member” biztonságos tagot.
  • CS9366: A nem biztonságos tag "tag" nem valósíthat meg biztonságos tag "tag"
  • CS9367: RequiresUnsafeAttribute erre a szimbólumra nem alkalmazható.
  • CS9368: RequiresUnsafeAttribute csak a frissített memóriabiztonsági szabályok érvényesek.
  • CS9376: A(z) 'unsafe' jelölésű „konstruktor” konstruktorhoz nem biztonságos környezet szükséges, hogy megfeleljen a(z) „általános típus vagy metódus” elemben lévő „típusparaméter” típusparaméter 'new()' megkötésének
  • CS9377: A "unsafe" módosítónak nincs hatása a jelenlegi memóriabiztonsági szabályok szerint.
  • CS9379: Ne használja a forrásban a ""RequiresUnsafeAttribute kifejezést, helyette használja a "unsafe" módosítót.
  • CS9388: A(z) „safe” módosító csak olyan „extern” tagokon használható, amelyek nincsenek „unsafe” jelöléssel ellátva.
  • CS9389: A "extern" tagot "" vagy "unsafesafe" jelöléssel kell ellátni.
  • CS9390: Mindkét részleges tag-deklarációnak "safe" jelöléssel kell rendelkeznie, vagy egyik sem lehet ""safe jelöléssel
  • CS9392: Az explicit vagy kiterjesztett elrendezésű mezőket "" vagy "unsafesafe" jelöléssel kell ellátni.
  • CS9396: A(z) "unsafe" vagy "safe" módosító nem adható meg egyszerre a tulajdonságon vagy indexelőn és annak hozzáférőjén a(z) 'property' esetében. Távolítsa el az egyiket.
  • CS9397: Nem adható meg ugyanaz a "unsafe" vagy "safe" módosító a tulajdonság vagy indexelő tulajdonság összes tartozékán. Ehelyett helyezze ezt a módosítót magára a tulajdonságra.
  • CS9398: Az „await” nem használható egy „fixed” utasítás kontextusában

Mutatóműveletek és dereferálás

  • CS0193: Az * vagy -> az operátort egy mutatóra kell alkalmazni
  • CS0196: Egy mutatót csak egy érték indexelhet
  • CS0242: A kérdéses művelet nincs meghatározva üres mutatókon

A mutatóműveletek helyes használatához kövesse a halasztási, indexelési és aritmetikai műveletekre vonatkozó szabályokat. További információ: Mutatótípusok és függvénymutatók.

  • A * vagy a -> operátor csak adatmutatókra (CS0193) alkalmazható. Ne használja ezeket az operátorokat nem mutató típusokkal vagy függvénymutatókkal. Ellentétben a C/C++-szal, a C#-ban nem lehet dereferálni a függvénymutatókat.
  • Csak egy értékkel rendelkező indexmutatók (CS0196). A mutatók nem támogatják a többdimenziós indexelést.
  • Kerülje az üres mutatókon (CS0242) definiálatlan műveleteket. Ne növelje például az üres mutatót, mert a fordító nem tudja a mutatott adatok méretét.

Mutatótípusok és kezelt típusok

  • CS0208: Nem lehet lekérni a címét, meghatározni a méretét, vagy mutatót deklarálni egy felügyelt típusra ('type')
  • CS0233: Az "azonosító" nem rendelkezik előre definiált mérettel, ezért a méret csak nem biztonságos környezetben használható
  • CS8500: Ez egy felügyelt típus ('type') címét veszi, lekéri a méretét, vagy egy rá mutató mutatót deklarál

A mutatókkal és az sizeof operátorral való helyes munkához használjon nem felügyelt típusokat és megfelelő környezeteket. További információ: Nem felügyelt típusok és az sizeof operátor.

  • Csak nem felügyelt típusok esetén használjon mutatót (CS0208). Ne vegyen címeket felügyelt típusoktól, ne határozza meg a méretüket, és ne deklaráljon mutatókat felügyelt típusokra. A felügyelt típusok hivatkozástípusokat és szerkezeteket tartalmaznak, amelyek referenciatípus-mezőket vagy tulajdonságokat tartalmaznak.
  • Használja az sizeof operátort egy unsafe környezetben olyan típusok használatakor, amelyek mérete nem fordítási időállandó (CS0233).
  • Kerülje a felügyelt típus címének lekérését, méretének meghatározását, illetve a rá mutató mutató deklarálását (CS8500). Ez a figyelmeztetés (4. szint) akkor aktiválódik, amikor a fordító mutatóműveleteket észlel a felügyelt típusok esetében. A felügyelt típus bármilyen referenciatípus, vagy bármely olyan szerkezet, amely egy referenciatípust tartalmaz mezőként vagy tulajdonságként. További információ: Nem felügyelt típusok.

Rögzített utasításhasználat

  • CS0209: A fixed utasításban deklarált helyi típusnak pointer típusúnak kell lennie
  • CS0210: Meg kell adnia egy inicializálót egy rögzített vagy using utasítás deklarációjában
  • CS0211: A megadott kifejezés címe nem vehető fel
  • CS0212: A rögzített utasítás inicializálója csak egy nem rögzített kifejezés címét veheti fel
  • CS0213: Nem használhatja a rögzített utasítást egy már rögzített kifejezés címének megvételéhez
  • CS0254: Előfordulhat, hogy a rögzített utasítás-hozzárendelés jobb oldala nem egy leadott kifejezés
  • CS0459: Nem kérhető le írásvédett helyi változó címe
  • CS0821: Implicit típusú helyi változók nem javíthatók
  • CS1656: Nem rendelhető érték a(z) „változóhoz”, mert ez egy „csak olvasható változótípus”.
  • CS8385: A megadott kifejezés nem használható rögzített utasításban

Ezek a hibák akkor fordulnak elő, ha helytelenül használja az fixed utasítást . Az fixed utasítás megakadályozza, hogy a szemétgyűjtő áthelyezjen egy mozgatható változót, és egy mutatót deklaráljon ehhez a változóhoz. További információ: Nem biztonságos kód és mutatók.

Az utasítás helyes használata fixed :

  • Deklarálja a változót mutatótípusként (CS0209).
  • Adjon meg egy inicializálót az fixed utasítás deklarációjában (CS0210).
  • Csak érvényes kifejezések címét vegye figyelembe: mezők, helyi változók és mutatók indirekt hivatkozásai (CS0211). Ne vegye figyelembe a számított kifejezések címét, például két változó összegét.
  • Az címszám operátort csak az utasítás-inicializálón belüli, nemfixált kifejezéseken használja (fixed).
  • Ne használjon utasítást fixed már rögzített kifejezéseken (CS0213). A unsafe metódusok helyi változói és paraméterei már rögzítve vannak a veremben.
  • Ne használjon leadott kifejezéseket az utasítás-hozzárendelés (fixed) jobb oldalán.
  • Ne használja az írásvédett helyi változók (CS0459) címét. A foreach ciklusokban, using utasításokban és fixed utasításokban található változók csak olvashatók. Ezt a hibát a fordító jelenlegi verziói már nem állítják elő.
  • Explicit típusokat használjon utasítások helyett varfixed (CS0821).
  • Ne rendeljen hozzá változókat írásvédett környezetekben, például foreach hurkokban vagy using és fixed utasításokban (CS1656).
  • Csak a(z) fixed utasításban rögzítésre alkalmas kifejezéseket használjon (CS8385). A kifejezésnek címezhető változónak, sztringnek vagy megfelelő GetPinnableReference metódust megvalósító típusnak kell lennie.

Nem biztonságos környezeti követelmények

  • CS0214: Mutatók és rögzített méretű pufferek csak nem biztonságos környezetben használhatók
  • CS0227: Nem biztonságos kód csak akkor jelenhet meg, ha a /unsafe parancsot használja
  • CS0244: Sem "" sem "isas" nem érvényes a mutatótípusokra
  • CS1919: Nem biztonságos típusú "típusnév" nem használható az objektum létrehozásakor
  • CS4004: Nem lehet await biztonságos környezetben
  • CS9123: A "&" operátor nem használható paramétereken vagy helyi változókon az aszinkron metódusokban
  • CS9360: Ez a művelet csak nem biztonságos környezetben használható
  • CS9361: stackalloc inicializáló nélküli SkipLocalsInit kifejezés csak nem biztonságos környezetben használható
  • CS9362: A(z) 'member' elemet unsafe kontextusban kell használni, mert 'unsafe' jelöléssel van ellátva
  • CS9363: A "tagot" nem biztonságos környezetben kell használni, mert mutatókkal rendelkezik az aláírásában
  • CS9376: A(z) 'new()' megszorítás teljesítéséhez a(z) 'generikus típus vagy metódus' elemben lévő 'típusparaméter' esetén nem biztonságos környezet szükséges a(z) 'unsafe' jelöléssel ellátott 'constructor' konstruktorhoz
  • CS9398: Az „await” nem használható „fixed” utasításkörnyezetben

Ezek a diagnosztika akkor fordul elő, ha nem biztonságos kódszerkezeteket használ a szükséges unsafe környezet nélkül, vagy olyan műveleteket kísérel meg, amelyek nem engedélyezettek a nem biztonságos típusokkal. További információ: Nem biztonságos kód és mutatók , valamint a unsafe kulcsszó.

  • Jelölje meg azokat a metódusokat, típusokat vagy kódblokkokat, amelyek mutatókat vagy rögzített méretű puffereket használnak a unsafe kulcsszóval (CS0214). A fordító explicit nem biztonságos környezetet igényel minden olyan kódhoz, amely mutatótípusokkal vagy rögzített méretű puffermezőkkel működik.
  • Engedélyezze az AllowUnsafeBlocks fordítóbeállítást a projektbeállításokban (CS0227). E lehetőség nélkül a fordító elutasítja az összes unsafe blokkot, még akkor is, ha a kód egyébként helyes.
  • Ne használja a is vagy as operátorokat mutatótípusokkal (CS0244). Ezek a típustesztelő operátorok nem érvényesek a mutatókra, mert a mutatók nem vesznek részt a típushierarchiában.
  • Ne használja az operátort new mutatótípus-példányok (CS1919) létrehozásához. Ha nem felügyelt memóriában szeretne objektumokat létrehozni, az interop használatával hívhatja meg a mutatókat visszamutató natív metódusokat.
  • A CS4004-et tekintse elavult iránymutatásnak. A C# 14-es és korábbi verzióiban a await használata nem engedélyezett nem biztonságos környezetben. A C# 15 előzetes verzió memóriabiztonsági változásai await nem biztonságos környezetben engedélyezettek, így ez a keretkorlátozás már nem írja le az aktuális szabályt.
  • Ne használja az operátor (&) címét paramétereken vagy helyi változókon az aszinkron metódusokban (CS9123). Előfordulhat, hogy a változó nem létezik a veremben, amikor az aszinkron művelet a felfüggesztési pont után folytatódik.
  • Jelölje meg a nem biztonságos szerkezeteket (például a mutató elhalasztását, a címzést vagy sizeof a nem felügyelt típusokat) tartalmazó műveleteket a unsafe kulcsszóval (CS9360). A C# 15 frissített memóriabiztonsági szabályai szerint a fordító azonosítja azokat az egyéni műveleteket, amelyek nem biztonságos környezetet igényelnek.
  • Használja a unsafe kulcsszót az stackalloc inicializálók nélküli kifejezésekhez, amikor az SkipLocalsInit attribútumot alkalmazzák (CS9361). Inicializáló nélkül a verem által lefoglalt memória nem inicializált adatokat tartalmaz, ami nem biztonságos művelet.
  • Használjon kontextust unsafe a megjelölt unsafe tagok (CS9362) vagy az aláírásukban mutatókkal rendelkező tagok (CS9363) meghívásakor. A frissített memóriabiztonsági modellben a fordító a CS9362 hibát jelzi azoknál a tagoknál, amelyek kifejezetten a hívóra hárítják át a biztonsági kötelezettséget, és a CS9363 hibát a visszamenőleges kompatibilitási esetekben, amikor maga a szignatúra pointereket tartalmaz.
  • Használjon unsafe környezetet, ha egy new() megkötés egy unsafe jelöléssel ellátott konstruktor meghívását követeli meg (CS9376). Az általános példányosítás implicit módon hívja meg a konstruktort, ezért a hívó környezetnek nem biztonságosnak kell lennie.
  • Helyezze át await a(z) fixed utasítás törzsén vagy inicializálóján kívülre (CS9398). A C# 15 előzetes verziója lehetővé teszi a(z) await használatát nem biztonságos környezetben, de a(z) fixed utasítás rögzítésének élettartama továbbra sem nyúlhat át egy aszinkron felfüggesztési ponton. Várja meg a műveletet a beírás fixedelőtt, vagy lépjen ki az fixed utasításból a várakozás előtt.

Nem biztonságos tagokra vonatkozó biztonsági szerződések

  • CS9364: A "nem biztonságos" tag nem bírálhatja felül a "biztonságos" tagot
  • CS9365: Nem biztonságos tag "tag" nem valósíthat meg implicit módon biztonságos tag "tag"
  • CS9366: A nem biztonságos "tag" nem valósíthat meg biztonságos "tag"-ot
  • CS9367: RequiresUnsafeAttribute erre a szimbólumra nem alkalmazható.
  • CS9368: RequiresUnsafeAttribute csak a frissített memóriabiztonsági szabályok érvényesek.
  • CS9377: A "unsafe" módosítónak nincs hatása a jelenlegi memóriabiztonsági szabályok szerint.
  • CS9379: Ne használja a forrásban a ""RequiresUnsafeAttribute kifejezést, helyette használja a "unsafe" módosítót.
  • CS9388: A(z) "safe" módosító csak olyan "extern" tagokon használható, amelyek nincsenek "unsafe" jelöléssel megjelölve.
  • CS9389: A "extern" tagot "" vagy "unsafesafe" jelöléssel kell ellátni.
  • CS9390: Mindkét részleges tagdeklarációt "safe" jelöléssel kell ellátni, vagy egyiket sem szabad "safe" jelöléssel ellátni
  • CS9396: A(z) "unsafe" vagy "safe" módosító nem adható meg egyszerre a(z) „property” tulajdonságon vagy indexelőn és annak elérőjén. Távolítsa el az egyiket.
  • CS9397: Nem adható meg ugyanaz a "unsafe" vagy "safe" módosító a tulajdonság vagy indexelő tulajdonság összes tartozékán. Ehelyett helyezze ezt a módosítót magára a tulajdonságra.

Ezek a diagnosztikák kikényszerítik a C# 15 biztonsági szerződés szabályait a nem biztonságosként megjelölt tagokra. A fordító biztosítja, hogy a nem biztonságos tagok ne sértse meg az alaposztályok és interfészek által támasztott biztonsági elvárásokat. További információ: Nem biztonságos kód és mutatók , valamint a unsafe kulcsszó.

  • Ne bíráljon felül egy biztonságos alaptagot egy nem biztonságos taggal (CS9364). A felülbírálásnak meg kell őriznie az alaptag biztonsági szerződését. Ha az alaptag biztonságos, a felülbírálásnak is biztonságosnak kell lennie. Távolítsa el a unsafe módosítót vagy RequiresUnsafeAttribute a felülíró tagot, vagy jelölje meg az alaptagot nem biztonságosként.
  • Ne implementáljon implicit módon biztonságos illesztőtagot nem biztonságos taggal (CS9365). Amikor egy típus implicit módon implementál egy illesztőtagot, a hívók az interfészen keresztül biztonságos műveletet várnak. Távolítsa el a nem biztonságos megjelölést a implementáló tagtól, vagy használjon explicit felületi implementációt.
  • Ne implementáljon explicit módon biztonságos illesztőtagot nem biztonságos taggal (CS9366). A felülettag biztonsági szerződését még explicit megvalósítás esetén is meg kell őrizni.
  • Csak a támogatott szimbólumtípusokra (RequiresUnsafeAttribute) alkalmazható. Ez az attribútum alkalmazható metódusokra, tulajdonságokra, eseményekre, konstruktorokra és típusokra, de nem minden szimbólumtípus támogatja azt.
  • Engedélyezze a frissített memóriabiztonsági szabályokat RequiresUnsafeAttribute (CS9368). Ez az attribútum a C# 15 kifinomult memóriabiztonsági modelljének része, és a régebbi szabályok szerint nem ismerik el. Győződjön meg arról, hogy a projekt olyan nyelvi verziót céloz meg, amely támogatja a frissített szabályokat.
  • Távolítsa el a unsafe módosítót, ha nincs hatása (CS9377). A jelenlegi memóriabiztonsági szabályok szerint bizonyos környezetek nem igénylik vagy nem élvezik a unsafe módosító előnyeit. A fordító figyelmezteti, ha a módosító értelmetlen, így törölheti a szükségtelen széljegyzeteket.
  • Használja a unsafe módosítót közvetlenül a tag deklarációján, ahelyett hogy a forráskódban a RequiresUnsafeAttribute elemet alkalmazná (CS9379). Az attribútum csak metaadat-megjelenítésre szolgál; a forráskódban a unsafe kulcsszó a megfelelő mechanizmus.
  • Az safe módosítót csak olyan extern tagokra alkalmazza, amelyek még nincsenek unsafe megjelölve (CS9388). A safe módosító kifejezetten az extern tagot választja az extern deklarációk alapértelmezett nem biztonságos feltételezéséből.
  • Jelöljön meg minden extern tagot unsafe vagy safe értékkel (CS9389). A frissített memóriabiztonsági szabályok értelmében az extern tagoknak explicit módon deklarálniuk kell a biztonsági szerződésüket, mert a fordító nem tudja ellenőrizni a megvalósítást.
  • Győződjön meg arról, hogy mindkét részleges tagnyilatkozat egyetért a safe módosítóval (CS9390). Ha az egyik részleges nyilatkozat meg van jelölve safe, a másikat is meg kell jelölni safe egy egységes biztonsági szerződés fenntartásához.
  • Helyezze a(z) safe vagy unsafe elemet vagy a tulajdonságra, vagy az indexelőre, illetve egy elérőre, de ne mindkettőre (CS9396). Ha a tulajdonság az összes elérő szerződését meghatározza, helyezze a módosítót magára a tulajdonságra. Ha csak egy tartozék különbözik, helyezze a módosító elemet a tartozékra, és hagyja a tulajdonságot változatlanul.
  • Ha egy tulajdonság vagy indexelő minden tartozéka ugyanazzal unsafe vagy safe módosítóval rendelkezne, helyezze át a módosítót a tulajdonság vagy indexelő deklarációjára (CS9397). A tartozékmódosítókat csak akkor használja, ha a tartozékok szándékosan eltérnek egymástól.

Explicit vagy bővített elrendezésű mezők

  • CS9392: Az explicit vagy kiterjesztett elrendezésű mezőket "" vagy "unsafesafe" jelöléssel kell ellátni.

Ez a diagnosztikai jelzés a frissített memóriabiztonsági modellben akkor fordul elő, amikor egy példánymező explicit vagy kiterjesztett elrendezés része, és a deklaráció nem adja meg, hogy a mező unsafe vagy safe. További információ: Nem biztonságos kód és mutatók , valamint a safe kulcsszó.

  • Jelölje meg egy típus minden példánymezőjét vagy [StructLayout(LayoutKind.Explicit)] értékkel úgy, hogy [ExtendedLayout] vagy unsafe legyen (safe). Ha a mező szintetizálva van egy automatikus tulajdonsághoz, mezőalapú tulajdonsághoz, elsődleges konstruktorparaméterhez vagy mezőhöz hasonló eseményhez, helyezze a módosítót arra a tulajdonságra, paraméterre vagy eseményre, amely a létrehozott mezőt birtokolja.

Rögzített méretű pufferek

  • CS1641: A rögzített méretű puffermezőnek a mező neve után a tömbméret-meghatározóval kell rendelkeznie
  • CS1642: A rögzített méretű puffermezők csak a szerkezetek tagjai lehetnek
  • CS1663: A rögzített méretű puffertípusnak a következők egyikének kell lennie: bool, byte, , short, int, longchar, sbyte, ushort, uint, ulongvagy floatdouble
  • CS1664: A rögzített méretű puffer hossza "hossz" és "típus" túl nagy
  • CS1665: A rögzített méretű puffereknek nullánál hosszabbnak kell lenniük
  • CS1666: Nem rögzített méretű puffereket nem lehet használni a nem rögzített kifejezésekben. Próbálja meg használni a rögzített utasítást.
  • CS1708: A rögzített méretű pufferek csak helyieken vagy mezőkön keresztül érhetők el
  • CS1716: Ne használjon ""System.Runtime.CompilerServices.FixedBuffer attribútumot. Használja helyette a "rögzített" mezőmódosítót.
  • CS7092: A rögzített pufferek csak egy dimenzióval rendelkezhetnek.
  • CS8372: Ne használjon "System.Runtime.CompilerServices.FixedBuffer" attribútumot egy tulajdonságon
  • CS9049: Egy rögzített mező nem lehet ref mező.

Ezek a hibák rögzített méretű pufferek használatakor fordulnak elő. A rögzített méretű pufferek olyan tömbök, amelyek közvetlenül a szerkezetekbe vannak ágyazva, és elsősorban interop forgatókönyvekhez használatosak. További információ: Rögzített méretű pufferek.

Rögzített méretű pufferek helyes deklarálása és használata:

  • Adja meg a tömbméretet a mező neve után egy pozitív egész számállandóval (CS1641, CS1665). A puffer teljes mérete (az elemszám és az elemméret szorzata) nem haladhatja meg a 2^31 bájtot (CS1664).
  • Rögzített méretű puffereket csak a szerkezetekben deklarálhat, az osztályokban (CS1642) nem. Használjon normál tömböt, ha egy osztályban szüksége van a mezőre.
  • Használja az egyik támogatott elemtípust: bool, , byte, short, intlong, char, sbyte, ushort, uint, , ulongfloatvagy double (CS1663).
  • Használjon egy fixed utasítást a tárolószerkezet rögzítéséhez a puffer (CS1666) elérése előtt.
  • Rögzített méretű puffereket csak helyieken vagy mezőkön keresztül érhet el, köztes kifejezéseken (CS1708) keresztül nem.
  • Az attribútum helyett használja a fixedSystem.Runtime.CompilerServices.FixedBuffer mezőmoderálót (CS1716). Ezt az attribútumot ne alkalmazza a tulajdonságokra (CS8372).
  • Rögzített pufferek deklarálása csak egy dimenzióval (CS7092). A többdimenziós rögzített pufferek nem támogatottak.
  • Ne deklarálja a rögzített méretű puffereket mezőkként ref (CS9049). A rögzített méretű puffereknek értékmezőknek kell lenniük.

Függvénymutatók

  • CS8812: A &metóduscsoport "metódus" nem függvény típusú mutatótípussá nem konvertálható.

Függvénymutató lekéréséhez használja az operátor címét egy explicit függvénymutató-típus leadással. Az operátor &címével ne rendeljen metóduscsoportokat void* vagy más nem függvénymutató-típusokat. További információ: Függvénymutatók.