Olvasás angol nyelven

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


Tömb- és gyűjteménydeklarációk és inicializálási kifejezések hibáinak és figyelmeztetéseinek elhárítása

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

  • CS0022: Nem megfelelő számú index található a(z) []ben, a várt "szám"
  • CS0178: Érvénytelen rangsoroló: várt "," vagy ""]
  • CS0248: Nem hozható létre negatív méretű tömb
  • CS0270: A tömb mérete nem adható meg változódeklarációban (próbálja meg inicializálni egy "new" kifejezéssel)
  • CS0611: A tömbelemek nem lehetnek típusúak
  • CS0623: A tömb inicializálói csak változóban vagy mező inicializálóban használhatók. Próbáljon meg helyette egy új kifejezést használni.
  • CS0650: Hibás tömbdeklarátor: Felügyelt tömb deklarálásához a rangkijelölő megelőzi a változó azonosítóját. Rögzített méretű puffermező deklarálásához használja a rögzített kulcsszót a mezőtípus előtt.
  • CS0719: A tömbelemek nem lehetnek statikus típusúak
  • CS0747: Érvénytelen inicializáló tagdeklarátor.
  • CS0820: Tömb inicializáló nem rendelhető implicit módon beírt helyihez
  • CS0826: Az implicit módon beírt tömbhöz nem található a legjobb típus.
  • CS0846: Beágyazott tömb inicializáló várható
  • CS1063: A gyűjtemény inicializáló elemének legjobban túlterhelt Add metódusa elavult.
  • CS1552: Tömbtípus-meghatározó, []a paraméter neve előtt kell megjelennie
  • CS1586: A tömb létrehozásának tömbméretet vagy tömb inicializálót kell tartalmaznia
  • CS1920: Az elem inicializálója nem lehet üres.
  • CS1921: A legjobb túlterhelt metódusegyezés nem megfelelő aláírást ad az inicializáló elemhez. Az inicializálható Add példánynak akadálymentes metódusnak kell lennie.
  • CS1925: A gyűjtemény inicializálójával nem inicializálható a "type" típusú objektum.
  • CS1950: A gyűjtemény inicializálójának legjobban túlterhelt Add metódusa érvénytelen argumentumokkal rendelkezik.
  • CS1954: A gyűjtemény inicializáló elemének legjobban túlterhelt metódusa nem használható. A gyűjtemény inicializálójánakAdd metódusai nem rendelkeznek ref vagy out paraméterekkel.
  • CS9174: A típus nem inicializálható gyűjteménykonstanssal, mert a típus nem konstruálható.
  • CS9176: A gyűjteménykonstanshoz nincs céltípus.
  • CS9185: A CollectionBuilderAttribute szerkesztőtípusnak nem általános osztálynak vagy szerkezetnek kell lennie.
  • CS9186: A CollectionBuilderAttribute metódusnév érvénytelen.
  • CS9187: Nem található elérhető metódus a várt aláírással: statikus metódus egyetlen típusú ReadOnlySpan<T>paraméterrel; és helyes visszatérési típussal
  • CS9188: A típus collectionBuilderAttribute típusú, elemtípus nélkül.
  • CS9203: Ebben a környezetben nem használható ilyen típusú gyűjteménykifejezés, mert az a jelenlegi hatókörön kívül is közzétehető.
  • CS9210: Ez a System.Collections.Immutable.ImmutableArray<T>verzió nem használható gyűjteménykifejezésekkel.

Ezenkívül a cikk a következő figyelmeztetéseket tartalmazza:

  • CS1062: A gyűjtemény inicializáló elemének legjobban túlterhelt Add metódusa elavult.
  • CS1064: A gyűjtemény inicializáló elemének legjobban túlterhelt Add metódusa elavult.
  • CS3007: A túlterhelt metódus "metódusa", amely csak névtelen tömbtípusok szerint különbözik, nem CLS-kompatibilis
  • CS3016: Az attribútumargumentumként megadott tömbök nem CLS-kompatibilisek
  • CS0251: Negatív indexű tömb indexelése (a tömbindexek mindig nullánál kezdődnek)
  • CS9208: A gyűjteménykifejezés váratlan halomfoglalásokat okozhat. Fontolja meg egy tömb explicit létrehozását, majd a végleges típusra való konvertálást, hogy a foglalás explicit legyen.
  • CS9209: A gyűjteménykifejezés váratlan halomfoglalásokat okozhat a ".." spreadek használata miatt. Fontolja meg egy tömb explicit létrehozását, majd a végleges típusra való konvertálást, hogy a foglalás explicit legyen.

A tömbökről, gyűjtemény inicializálókról és gyűjteménykifejezésekről az alábbi cikkekben talál további információt:

Érvénytelen gyűjtemény inicializálója

A következő hibák azt jelzik, hogy a gyűjtemény inicializálójának fordítója által létrehozott kód érvénytelen:

  • CS0747: Érvénytelen inicializáló tagdeklarátor.
  • CS1063: A gyűjtemény inicializáló elemének legjobban túlterhelt Add metódusa elavult.
  • CS1920: Az elem inicializálója nem lehet üres.
  • CS1921: A legjobb túlterhelt metódusegyezés nem megfelelő aláírást ad az inicializáló elemhez. Az inicializálható Add példánynak akadálymentes metódusnak kell lennie.
  • CS1950: A gyűjtemény inicializálójának legjobban túlterhelt Add metódusa érvénytelen argumentumokkal rendelkezik.
  • CS1954: A gyűjtemény inicializáló elemének legjobban túlterhelt metódusa nem használható. A gyűjtemény inicializálójánakAdd metódusai nem rendelkeznek ref vagy out paraméterekkel.
  • CS9174: A típus nem inicializálható gyűjteménykonstanssal, mert a típus nem konstruálható.
  • CS9176: A gyűjteménykonstanshoz nincs céltípus.
  • CS9203: Ebben a környezetben nem használható ilyen típusú gyűjteménykifejezés, mert az a jelenlegi hatókörön kívül is közzétehető.
  • CS9210: Ez a System.Collections.Immutable.ImmutableArray<T>verzió nem használható gyűjteménykifejezésekkel.

A fordító a következő figyelmeztetést is generálhatja:

  • CS1062: A gyűjtemény inicializáló elemének legjobban túlterhelt Add metódusa elavult.
  • CS1064: A gyűjtemény inicializáló elemének legjobban túlterhelt Add metódusa elavult.
  • CS9208: A gyűjteménykifejezés váratlan halomfoglalásokat okozhat. Fontolja meg egy tömb explicit létrehozását, majd a végleges típusra való konvertálást, hogy a foglalás explicit legyen.
  • CS9209: A gyűjteménykifejezés váratlan halomfoglalásokat okozhat a ".." spreadek használata miatt. Fontolja meg egy tömb explicit létrehozását, majd a végleges típusra való konvertálást, hogy a foglalás explicit legyen.

A hibák mindegyike azt jelzi, hogy a gyűjtemény inicializálójának fordítója által létrehozott kód érvénytelen. Ellenőrizze a következőt:

  • A gyűjtemény inicializálója elemek sorozatát tartalmazza. A gyűjteménypéldány beállítási tulajdonságait nem keverheti össze az ugyanabban az inicializálóban lévő elemek hozzáadásával.
  • A kapcsos zárójeleket ({ és }) tartalmazó gyűjtemény inicializálója nem lehet üres.
  • Az osztálynak implementálnia kell az IEnumerable-t, és nyilvános Add metódussal kell rendelkeznie.
  • A megfelelő Add metódusnak elérhetőnek kell lennie, és egy olyan paramétert kell használnia, amely megegyezik a gyűjtemény elemeivel. A paraméter nem tartalmazhatja a módosító vagy out a ref módosító paramétert.
  • A túlterhelés feloldásának egy Add módszert kell választania jobb egyezésként. Nem lehet több olyan egyező metódus, amely egyformán jó.
  • A gyűjteménykifejezések inicializálhatják a gyűjteménytípus explicit módon beírt változóit. Ha a változó nem gyűjtemény- vagy tömbtípus, vagy implicit módon van begépelve (használatával var), akkor a gyűjtemény inicializálója nem használható.
  • A ref struct hasonló System.Span<T> típusok nem inicializálhatók olyan gyűjteménykifejezéssel, amely sértheti a ref biztonságát.
  • A gyűjteménykifejezések nem tudják megfelelően inicializálni az System.Collections.Immutable.ImmutableArray<T> aktuális verziót. Használja a futtatókörnyezet egy másik verzióját, vagy módosítsa az inicializálási kifejezést.

A figyelmeztetések azt jelzik, hogy a gyűjteménykifejezés, beleértve az oldalpárokat is, memóriát foglalhat le. A különböző tárolók létrehozása és konvertálása hatékonyabb lehet.

Érvénytelen tömb inicializáló

  • CS0623: A tömb inicializálói csak változóban vagy mező inicializálóban használhatók. Próbáljon meg helyette egy új kifejezést használni.
  • CS0846: Beágyazott tömb inicializáló várható
  • CS1925: A gyűjtemény inicializálójával nem inicializálható a "type" típusú objektum.

Ezek a hibák azt jelzik, hogy érvénytelen inicializálót hozott létre. A valószínű ok a kiegyensúlyozatlan kapcsos zárójelek { és } egy vagy több elem vagy gyermektömb körül. Győződjön meg arról, hogy az inicializálási kifejezés megegyezik a szaggatott tömb inicializálásában lévő tömbök számával, és hogy a kapcsos zárójelek kiegyensúlyozottak.

Érvénytelen tömbelem-hozzáférés

  • CS0022: Nem megfelelő számú index található a(z) []ben, a várt "szám"
  • CS0251: Negatív indexű tömb indexelése (a tömbindexek mindig nullánál kezdődnek)

A tömb egy eleméhez úgy férhet hozzá, hogy megadja a tömbben deklarált egyes tengelyek indexét. Az indexek a tömb neve között [ és ] után vannak. A tömbindexekre két szabály van:

  1. Meg kell adnia a tömbdeklarációban használt indexek számát. Ha a tömb egy dimenzióval rendelkezik, egy indexet kell megadnia. Ha a tömb három dimenzióval rendelkezik, három indexet kell megadnia.
  2. Minden indexnek nem negatív egész számnak kell lennie.

Érvénytelen tömb rangja

  • CS0178: Érvénytelen rangsoroló: várt "," vagy ""]
  • CS0650: Hibás tömbdeklarátor: Felügyelt tömb deklarálásához a rangkijelölő megelőzi a változó azonosítóját. Rögzített méretű puffermező deklarálásához használja a rögzített kulcsszót a mezőtípus előtt.
  • CS1552: Tömbtípus-meghatározó, []a paraméter neve előtt kell megjelennie

A tömbdeklarációk a következő jogkivonatokból állnak, sorrendben:

  1. A tömbelemek típusa. Például, intvagy stringSomeClassType.
  2. A tömb szögletes zárójelei, opcionálisan vesszőkkel, amelyek több dimenziót jelölnek.
  3. A változó neve.

Ha egy tömb inicializálása megadja a tömbdimenziókat, a következő tulajdonságokat adhatja meg:

  • A kapcsos zárójelek számos eleme ({ és })
  • Üres zárójelek
  • Egy vagy több szögletes zárójelbe zárt vessző

A következők például érvényes tömbdeklarációk:

C#
int[] anArrayOfIntegers;
string[,,] threeDimensionalStringArray;

További információ: A tömb inicializálóinak C# specifikációja (C# nyelvi specifikáció) szakasza.

Érvénytelen tömbhossz

  • CS0248: Nem hozható létre negatív méretű tömb
  • CS0270: A tömb mérete nem adható meg változódeklarációban (próbálja meg inicializálni egy "új" kifejezéssel
  • CS1586: A tömb létrehozásának tömbméretet vagy tömb inicializálót kell tartalmaznia

A tömb minden dimenziójának hosszát a tömb inicializálásának részeként kell megadni, nem annak deklarációjaként. Az egyes dimenziók hosszának pozitívnak kell lennie. Megadhatja a hosszt egy new kifejezéssel a tömb lefoglalásához, vagy egy tömb inicializáló használatával az összes elem hozzárendeléséhez. Az alábbi példa mindkét mechanizmust mutatja be:

C#
int[] fiveIntegers = new int[5];
string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

Érvénytelen elemtípus

  • CS0611: A tömbelemek nem lehetnek "type" típusúak
  • CS0719: A tömbelemek nem lehetnek statikus típusúak
  • CS0820: Tömb inicializáló nem rendelhető implicit módon beírt helyihez
  • CS0826: Az implicit módon beírt tömbhöz nem található a legjobb típus.

Vannak olyan típusok, amelyek nem használhatók tömbtípusként. Ezek a típusok a következők: System.TypedReference és System.ArgIterator. A tömb típusa nem lehet static osztály, mert az osztálypéldányok nem hozhatók static létre.

Tömböket implicit módon beírt helyi változókként deklarálhat. A tömböt egy new kifejezéssel kell inicializálni. Emellett a tömb inicializáló minden elemének a legjobban elterjedt típussal kell rendelkeznie. Az alábbi példák bemutatják, hogyan deklarálhatók implicit módon beírt tömbök:

C#
var implicitType = new[] { 1, 2, 3 };
        
char c = 'c';
short s1 = 0;
short s2 = -0;
short s3 = 1;
short s4 = -1;

// common type is "int"
var commonType = new[] { s1, s2, s3, s4, c, 1 };

A leggyakoribb típust az alábbi technikák bármelyikével biztosíthatja:

  • Adjon explicit típust a tömbnek.
  • Adja meg az összes tömbelemnek ugyanazt a típust.
  • Adjon explicit szereplőket azokra az elemekre, amelyek okozhatják a problémát.

Érvénytelen gyűjteményszerkesztő

A következő hibák a gyűjteményszerkesztő típusának hibáit jelzik:

  • CS9185: A CollectionBuilderAttribute szerkesztőtípusnak nem általános osztálynak vagy szerkezetnek kell lennie.
  • CS9186: A CollectionBuilderAttribute metódus neve érvénytelen.
  • CS9187: Nem található elérhető metódus a várt aláírással: statikus metódus egyetlen típusú ReadOnlySpan<T>paraméterrel; és helyes visszatérési típussal.
  • CS9188: A típusnak van elemtípusa CollectionBuilderAttribute , de nincs elemtípusa.

Ezek a hibák azt jelzik, hogy a gyűjteményszerkesztő típusát módosítani kell. Jegyezze meg a következő szabályokat:

  • A gyűjteménytípusnak iterációs típussal kell rendelkeznie. Más szóval a típus gyűjteményként is használható foreach .
  • A gyűjteményszerkesztő típusa nem lehet általános típus.
  • A megadott System.Runtime.CompilerServices.CollectionBuilderAttribute metódusnévnek érvényes metódusnévnek kell lennie. Nem lehet például véglegesítő vagy érvénytelen azonosító karaktereket tartalmazó más név.
  • A gyűjteménykészítő metódusnak akadálymentes statikus metódusnak kell lennie. Vissza kell adnia a gyűjtemény típusát, és meg kell adnia egy olyan paramétert ReadOnlySpan<T> , amely T megfelel a gyűjtemény elemtípusának.

Gyakori nyelvi specifikációs figyelmeztetések

  • CS3007: A túlterhelt metódus "metódusa", amely csak névtelen tömbtípusok szerint különbözik, nem CLS-kompatibilis
  • CS3016: Az attribútumargumentumként megadott tömbök nem CLS-kompatibilisek

A CS3007 akkor fordul elő, ha túlterhelt metódussal rendelkezik, amely egy szaggatott tömböt használ, és a metódusaadékok között az egyetlen különbség a tömb elemtípusa. A hiba elkerülése érdekében érdemes lehet téglalap alakú tömböt használni a szaggatott tömb helyett, vagy ha a CLS-megfelelőségre nincs szükség, távolítsa el az CLSCompliantAttribute attribútumot. A CLS-megfelelőségről további információt a nyelvfüggetlenséggel és a nyelvfüggetlen összetevőkkel kapcsolatban talál.

A CS3016 azt jelzi, hogy a common language specification (CLS) nem felel meg a tömb attribútumnak való átadásához. A CLS-megfelelőségről további információt a nyelvi függetlenség és a nyelvfüggetlen összetevők című témakörben talál.