Megosztás a következőn keresztül:


Hibák és figyelmeztetések megoldása beágyazott tömbdeklarációkkal

Ez a cikk a következő fordítóhibákat és figyelmeztetéseket ismerteti:

  • CS9125: A SizeConst attribútumparamétert meg kell adni.
  • CS9164: Nem konvertálható kifejezés Span<T> , mert nem hozzárendelhető változó
  • CS9165: Nem konvertálható a kifejezés ReadOnlySpan<T> , mert lehet, hogy nem továbbítja vagy nem adja vissza hivatkozással
  • CS9166: Az index kívül esik a beágyazott tömb határain
  • CS9167: A beágyazott tömb hosszának 0-nál nagyobbnak kell lennie.
  • CS9168: A beágyazott tömbstruktúra nem rendelkezhet explicit elrendezésűel.
  • CS9169: A beágyazott tömbszerkezetnek egy és csak egy példánymezőt kell deklarálnia, amely nem lehet hiv mező.
  • CS9172: A beágyazott tömbtípusok elemei csak egyetlen argumentummal érhetők el implicit módon átalakíthatóvá int, vagy System.Index. System.Range
  • CS9173: Előfordulhat, hogy egy beágyazott tömbelérés nem rendelkezik elnevezett argumentum-megjelölővel
  • CS9180: A beágyazott tömbelem mező nem deklarálható kötelezőként, olvashatóan, illékonyként vagy rögzített méretű pufferként.
  • CS9181: A beágyazott tömbindexelő nem használható elemhozzáférés-kifejezéshez.
  • CS9182: A "Slice" beágyazott tömb metódusa nem használható elemelérési kifejezéshez.
  • CS9183: A beágyazott tömbkonvertálási operátor nem használható a deklarálási típus kifejezéséből való átalakításhoz.
  • CS9184: A beágyazott tömbök nyelvi funkciója nem támogatott olyan beágyazott tömbtípusok esetében, amelyek elemmezője ""ref mező, vagy típusargumentumként érvénytelen típussal rendelkezik.
  • CS9189: foreach egy beágyazott típusú tömb utasítása nem támogatott
  • CS9259: Az attribútum System.Runtime.CompilerServices.InlineArrayAttribute nem alkalmazható rekordstruktúra esetén.

Beágyazott tömbdeklaráció

A beágyazott tömböket egyetlen mezővel rendelkező típusként és a tömb hosszát meghatározó attribútumként struct deklarálhatja. A fordító a következő hibákat generálja érvénytelen beágyazott tömbdeklarációk esetén:

  • CS9125: A SizeConst attribútumparamétert meg kell adni.
  • CS9167: A beágyazott tömb hosszának 0-nál nagyobbnak kell lennie.
  • CS9168: A beágyazott tömbstruktúra nem rendelkezhet explicit elrendezésűel.
  • CS9169: A beágyazott tömbszerkezetnek egy és csak egy példánymezőt kell deklarálnia, amely nem lehet hiv mező.
  • CS9180: A beágyazott tömbelem mező nem deklarálható kötelezőként, olvashatóan, illékonyként vagy rögzített méretű pufferként.
  • CS9184: A beágyazott tömbök nyelvi funkciója nem támogatott olyan beágyazott tömbtípusok esetében, amelyek elemmezője ""ref mező, vagy típusargumentumként érvénytelen típussal rendelkezik.
  • CS9259: Az attribútum System.Runtime.CompilerServices.InlineArrayAttribute nem alkalmazható rekordstruktúra esetén.

A tömbök javításához győződjön meg arról, hogy a következők teljesülnek:

  • A argumentum System.Runtime.CompilerServices.InlineArrayAttribute pozitív egész szám.
  • A beágyazás struct nem határoz meg explicit elrendezést.
  • A beágyazás struct egyetlen példánymezővel rendelkezik, és ez a példánymező nem ref mező.
  • Az egypéldányos mező nem rögzített méretű puffer.
  • Az egypéldányos mező nem tartalmazza a required, volatilevagy readonly módosítókat.
  • Távolítsa el a record módosítót a beágyazott tömbdeklarációból.

Elemhozzáférés

A beágyazott tömb elemeit ugyanúgy érheti el, mint bármely tömböt. A fordító a következő hibákat bocsátja ki a helytelen elemhozzáférésből:

  • CS9166: Az index kívül esik a beágyazott tömb határain
  • CS9172: A beágyazott tömbtípusok elemei csak egyetlen argumentummal érhetők el implicit módon átalakíthatóvá int, vagy System.Index. System.Range
  • CS9173: Előfordulhat, hogy egy beágyazott tömbelérés nem rendelkezik elnevezett argumentum-megjelölővel
  • CS9189: foreach egy beágyazott típusú tömb utasítása nem támogatott

Emellett a fordító a következő figyelmeztetést adja ki indexelő deklarálásakor:

  • CS9181: A beágyazott tömbindexelő nem használható elemhozzáférés-kifejezéshez.

A beágyazott pufferhez létrehozott kód közvetlenül éri el a puffermemóriát, megkerülve a deklarált indexelőket. Beágyazott tömbök nem használhatók az foreach utasítással.

Az indexelő argumentumának a következőnek kell lennie:

  • Az alábbi három típus egyike: inta System.Index vagy a System.Range.
  • Nem lehet névvel ellátott argumentum. A fordító létrehozza az elem tartozékát. A paraméternek nincs neve, ezért nevesített argumentumokat nem használhat.
  • A tömb határai közé tartozik. Az összes .NET-tömbhöz hasonlóan a beágyazott tömbelem-hozzáférés is be van jelölve. Az indexnek a beágyazott tömbön belül kell lennie.

Átszámítás spanra

Gyakran használ System.Span<T> vagy System.ReadOnlySpan<T> használ beágyazott tömböket. A fordító az alábbi hibákat generálja érvénytelen konverziók esetén:

  • CS9164: Nem konvertálható kifejezés Span<T> , mert nem hozzárendelhető változó
  • CS9165: Nem konvertálható a kifejezés ReadOnlySpan<T> , mert lehet, hogy nem továbbítja vagy nem adja vissza hivatkozással

A fordító olyan kódot hoz létre, amely közvetlenül hozzáfér egy beágyazott puffer memóriájába. Ezért néhány tagot soha nem hívnak meg. A fordító a következő figyelmeztetéseket hozza létre, ha olyan tagot ír, akit soha nem hív meg:

  • CS9182: A "Slice" beágyazott tömb metódusa nem használható elemelérési kifejezéshez.
  • CS9183: A beágyazott tömbkonvertálási operátor nem használható a deklarálási típus kifejezéséből való átalakításhoz.

A beágyazott tömbök implicit módon átalakíthatók beágyazott tömbökké Span<T> , vagy ReadOnlySpan<T> átadhatók egy beágyazott tömbnek a metódusok számára. A fordító kikényszeríti az ilyen átalakításokra vonatkozó korlátozásokat:

  • A beágyazott tömbnek írhatónak kell lennie ahhoz, hogy beágyazott tömböt Span<T>alakíthasson át . Ha a tömb írásvédett, nem konvertálhatja írhatóvá Span<T>. ReadOnlySpan<T> Használhatja helyette.
  • A beágyazott tömb biztonságos környezetének legalább olyan szélesnek kell lennie, mint az átalakítás biztonságos környezeteSpan<T> vagy ReadOnlySpan<T> sikeressége. Vagy korlátoznia kell a hatókört, vagy ki kell bontania a beágyazott tömb hatókörét.

Emellett a fordító soha nem generál hívásokat egy Slice metódushoz beágyazott pufferben. Átalakító operátorok beágyazott pufferekká alakításához Span , vagy ReadOnlySpan nem hívhatók meg. A fordító létrehoz egy System.Span<T> vagy System.ReadOnlySpan<T> közvetlenül a memóriapufferből származó kódot.