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 'safe' és a 'unsafe' módosító nem használható együtt.
  • 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.
  • unsafe Olyan kifejezéskörnyezet használata, amelyben egy nem biztonságos, paraméter nélküli konstruktort igénylő típusargumentumnak meg kell felelnie egy struct vagy new() megkötésnek (CS9376). Az olyan deklarációk esetében, mint egy alaptípus vagy mezőtípus, a nem biztonságos konstruktor nem tudja teljesíteni a megkötést; ehelyett használjon biztonságos paraméter nélküli konstruktort tartalmazó típust.
  • 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 "safe" és a "unsafe" módosító nem használható együtt.
  • 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.
  • Válasszon safe vagy unsafe deklarációt, ne mindkettőt (CS9388). A safe módosító úgy jelöli meg a deklarációt, hogy nem igényel unsafe környezetet; nem korlátozódik a(z) extern tagokra.
  • 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.