Řešení chyb a upozornění v deklarcích polí a kolekcí a inicializačních výrazech

Tento článek se zabývá následujícími chybami kompilátoru:

  • CS0022: Nesprávný počet indexů uvnitř [], očekávané 'číslo'
  • CS0178: Neplatný specifikátor pořadí: byl očekáváno ",' nebo ']'
  • CS0248: Nelze vytvořit pole se zápornou velikostí
  • CS0270: Velikost pole nelze zadat v deklaraci proměnné (zkuste inicializovat výrazem 'new' ).
  • CS0611: Prvky pole nemohou být typu
  • CS0623: Inicializátory polí lze použít pouze v proměnné nebo inicializátoru pole. Zkuste místo toho použít nový výraz.
  • CS0650: Chybný deklarátor pole: Chcete-li deklarovat spravované pole, specifikátor pořadí předchází identifikátoru proměnné. Chcete-li deklarovat pole vyrovnávací paměti pevné velikosti, použijte pevné klíčové slovo před typem pole.
  • CS0719: Prvky pole nemohou být statického typu
  • CS0747: Deklarátor člena inicializátoru je neplatný.
  • CS0820: Nelze přiřadit inicializátor pole k implicitně zadanému místnímu prostředí
  • CS0826: Pro implicitně napsané pole nebyl nalezen žádný nejlepší typ.
  • CS0846: Očekává se inicializátor vnořeného pole
  • CS1063: Nejlepší přetížená metoda Add pro prvek kolekčního inicializátoru je zastaralá.
  • CS1552: Specifikátor typu pole, []musí být uveden před názvem parametru.
  • CS1586: Deklarace pole musí obsahovat velikost pole nebo inicializátor pole
  • CS1920: Inicializátor elementu nemůže být prázdný.
  • CS1921: Nejlepší přetížená metoda má nesprávný podpis pro element inicializátoru. Inicializovatelná musí být přístupná Add metoda instance.
  • CS1925: Objekt typu type 'type' nelze inicializovat inicializátorem kolekce.
  • CS1950: Nejlepší přetížená metoda Add pro inicializátor kolekce má některé neplatné argumenty.
  • CS1954: Nelze použít nejlepší přetíženou metodu odpovídající elementu inicializátoru kolekce. Metody inicializátoru kolekce Add nesmí mít parametry typu ref nebo out.
  • CS9174: Nelze inicializovat typ s literálem kolekce, protože typ není konstruovatelný.
  • CS9176: Pro literál kolekce neexistuje žádný cílový typ.
  • CS9185: Typ tvůrce CollectionBuilderAttribute musí být ne generickou třídou nebo strukturou.
  • CS9186: Název metody CollectionBuilderAttribute je neplatný.
  • CS9187: Nelze najít přístupnou metodu s očekávaným podpisem: statická metoda s jedním parametrem typu ReadOnlySpan<T>; a správný návratový typ
  • CS9188: Typ má CollectionBuilderAttribute, ale žádný typ elementu.
  • CS9203: Výraz pro kolekci tohoto typu nelze v tomto kontextu použít, protože může být zviditelněn mimo aktuální obor.
  • CS9210: Tuto verzi System.Collections.Immutable.ImmutableArray<T>nelze použít s výrazy kolekce.
  • CS9212: Operátor šíření '..' nemůže pracovat s proměnnými typu 'type', protože 'type' neobsahuje veřejnou instanci nebo definici rozšíření pro 'member'.
  • CS9213: Cíl výrazu kolekce 'type' nemá žádný typ prvku.
  • CS9214: Typ výrazu kolekce musí mít použitelný konstruktor, který lze volat bez argumentů.
  • CS9215: Typ výrazu kolekce musí mít instanci nebo rozšiřující metodu Add, kterou lze volat jedním argumentem.
  • CS9222: Inicializátor kolekce vede k nekonečnému řetězu instancí kolekce 'typu'.
  • CS9332: Operátor spread '.' nelze použít ve výrazu filtru klauzule catch.
  • CS9354: Element with(...) musí být prvním prvkem.
  • CS9355: Prvky 'with(...)' nejsou podporovány pro typ 'type'.
  • Argumenty prvku 'with(...)' nesmí být dynamické.
  • CS9357: Element with(...) pro rozhraní jen pro čtení musí být prázdný, pokud je k dispozici.
  • CS9358: Typ elementu této kolekce nesmí být ref struktura ani parametr typu povolující ref struktury
  • CS9359: Žádné přetížení metody "method" přebírá argumenty elementu number 'with(...)'.

Kromě toho jsou v tomto článku popsána následující upozornění:

  • CS1062: Nejlepší přetížená metoda Add pro inicializační prvek kolekce je zastaralá.
  • CS1064: Nejvhodnější přetížená metoda Add pro inicializátor elementu kolekce je zastaralá.
  • CS3007: Přetížená metoda "method", která se liší pouze nepojmenovanými typy polí, není kompatibilní se specifikací CLS
  • CS3016: Pole jako argumenty atributů nejsou v souladu se specifikací CLS
  • CS0251: Indexování pole se záporným indexem (indexy matice vždy začínají nulou)
  • CS9208: Výraz kolekce může mít neočekávané přidělení haldy. Zvažte explicitní vytvoření pole a následný převod na konečný typ, aby bylo přidělení explicitní.
  • CS9209: Výraz kolekce může způsobit neočekávané alokace na haldě kvůli použití rozprostření '..'. Zvažte explicitní vytvoření pole a následný převod na konečný typ, aby bylo alokování zjevné.
  • CS9332: Operátor spread '.' nelze použít ve výrazu filtru klauzule catch.

Neplatný přístup k elementu pole

  • CS0022: Nesprávný počet indexů uvnitř [], očekávané 'číslo'
  • CS0251: Indexování pole se záporným indexem (indexy matice vždy začínají nulou)

Chcete-li získat přístup k prvkům pole správně, postupujte podle těchto pravidel indexování. Další informace naleznete v tématu Pole.

  • Zadejte stejný počet indexů jako deklarované dimenze (CS0022). Jednorozměrné pole potřebuje jeden index; Třírozměrné pole potřebuje tři indexy.
  • Pro indexy pole (CS0251) používejte pouze nezáporná celá čísla. Indexy pole vždy začínají nulou.

Neplatný inicializátor kolekce

  • CS0747: Deklarátor člena inicializátoru je neplatný.
  • CS1920: Inicializátor elementu nemůže být prázdný.
  • CS1921: Nejlepší přetížená metoda má nesprávný podpis pro element inicializátoru. Inicializovatelná musí být přístupná Add metoda instance.
  • CS1922: Nelze inicializovat typ type 'type' s inicializátorem kolekce, protože 'type' neimplementuje 'System.Collections.IEnumerable'.
  • CS1925: Objekt typu type 'type' nelze inicializovat inicializátorem kolekce.
  • CS1927: Upozornění: Ignorování /win32manifest pro modul, jelikož se vztahuje pouze na sestavení
  • CS1950: Nejlepší přetížená metoda Add pro inicializátor kolekce má některé neplatné argumenty.
  • CS1954: Nejlepší přetížená metoda odpovídající elementu inicializátoru kolekce nemůže být použita. Metody inicializátoru kolekce nesmí obsahovat ref nebo out parametry.
  • CS9174: Nelze inicializovat typ pomocí literálu kolekce, protože typ není konstruovatelný.
  • CS9176: Pro literál kolekce neexistuje žádný cílový typ.
  • CS9203: Výraz kolekce tohoto typu nelze v tomto kontextu použít, protože může být přístupný mimo aktuální rozsah.
  • CS9210: Tuto verzi System.Collections.Immutable.ImmutableArray<T> nelze použít s kolekčními výrazy.
  • CS9212: Operátor šíření '..' nemůže pracovat s proměnnými typu 'type', protože 'type' neobsahuje veřejnou instanci nebo definici rozšíření pro 'member'.
  • CS9213: Cíl výrazu kolekce 'type' nemá žádný typ prvku.
  • CS9214: Typ výrazu kolekce musí mít použitelný konstruktor, který lze volat bez argumentů.
  • CS9215: Typ výrazu kolekce musí mít instanci nebo rozšiřující metodu Add, kterou lze volat jedním argumentem.
  • CS9222: Inicializátor kolekce vede k nekonečnému řetězu instancí kolekce typu.
  • CS9332: Operátor spread '.' nelze použít ve výrazu filtru klauzule catch.
  • CS9354: Element with(...) musí být prvním prvkem.
  • CS9355: Prvky 'with(...)' nejsou podporovány pro typ 'type'.
  • CS9356: Argumenty elementu with(...) nemohou být dynamické.
  • CS9357: Element with(...) pro rozhraní jen pro čtení musí být prázdný, pokud je k dispozici.
  • CS9358: Typ elementu této kolekce nemusí být referenční struktura nebo parametr typu umožňující struktury ref
  • CS9359: Žádné přetížení metody 'method' neakceptuje 'number' argumentů typu 'with(...)'

Kompilátor může také vygenerovat následující upozornění:

  • CS1062: Nejvhodnější přetížená metoda Add pro prvek inicializátoru kolekce je zastaralá.
  • CS1063: Nejlepší přetížená metoda Add pro inicializační prvek kolekce je zastaralá.
  • CS1064: Nejvhodnější přetížená metoda Add pro prvek inicializátoru kolekce je zastaralá.
  • CS9208: Výraz kolekce může mít neočekávané přidělení haldy. Zvažte explicitní vytvoření pole a následný převod na konečný typ, aby bylo přidělení explicitní.
  • CS9209: Výraz kolekce může vyvolat neočekávané přidělení haldy kvůli použití '..' rozprostření. Zvažte, zda explicitně vytvořit pole a poté je převést na konečný typ, aby bylo přidělení zřejmé.

Chcete-li vytvořit platné inicializátory kolekce, postupujte podle těchto pravidel. Další informace naleznete viz část Výrazy kolekce.

  • Nekombinujte inicializaci vlastností s přidáním elementu do stejného inicializátoru (CS0747).
  • Do inicializátorů kolekce s složenými závorkami (CS1920) zahrňte aspoň jeden prvek.
  • Ujistěte se, že typ kolekce implementuje IEnumerable (CS1922).
  • Inicializátory kolekcí používejte pouze u typů kolekcí (CS1925).
  • Ověřte, že Add je metoda přístupná, přebírá jeden parametr odpovídající typu elementu a nepoužívá ref ani out modifikátory (CS1921, CS1954).
  • Vyřešte nejednoznačné přetížení metod Add (CS1950).
  • Zadejte explicitní cílový typ pro výrazy kolekce, když ho kompilátor nemůže odvodit (CS9176, CS9213).
  • Ujistěte se, že typ kolekce lze vytvořit konstruktor bez parametrů (CS9174, CS9214).
  • Nepoužívejte ref struct typy ve výrazech kolekce, které mohou narušit bezpečnost ref (CS9203).
  • Aktualizujte na kompatibilní verzi prostředí pro běh pro ImmutableArray výrazy kolekce (CS9210).
  • Implementujte vzorce výčtu (například GetEnumerator) pro podporu operátoru šíření (CS9212).
  • Vyhněte se cyklovým závislostem v inicializaci kolekce (CS9222).
  • Nepoužívejte operátor rozbalování ve výrazech filtru klauzule catch (CS9332).
  • Umístěte with(...) prvek na první pozici ve výrazech kolekce (CS9354).
  • Používejte with(...) prvky pouze u typů, které podporují argumenty výrazů kolekce (CS9355).
  • Nepoužívejte dynamické argumenty v with(...) prvcích (CS9356).
  • Pro typy rozhraní jen pro čtení (with()) použijte prázdné.
  • Nepoužívejte typy ref struktur jako typy prvků v kolekcích, které je nepodporují (CS9358).
  • Porovná počet argumentů s dostupnými with(...) přetíženími konstruktoru (CS9359).

Neplatné pořadí polí

  • CS0178: Neplatný specifikátor pořadí: byl očekáváno ",' nebo ']'
  • CS0650: Chybný deklarátor pole: Chcete-li deklarovat spravované pole, specifikátor pořadí předchází identifikátoru proměnné. Chcete-li deklarovat pole vyrovnávací paměti pevné velikosti, použijte pevné klíčové slovo před typem pole.
  • CS1552: Specifikátor typu pole, []musí být uveden před názvem parametru.

Chcete-li deklarovat pole správně, postupujte podle správného pořadí syntaxe. Další informace naleznete v části Pole a specifikace jazyka C# v inicializátorech polí.

Deklarace pole se skládá z těchto tokenů v pořadí:

  1. Typ prvků pole (například int, string, nebo SomeClassType).
  2. Maticové závorky, volitelně včetně čárek pro více dimenzí.
  3. Název proměnné.

Při zadávání dimenzí pole můžete použít:

  • Počet prvků ve složených závorkách ({ a })
  • Prázdné závorky
  • Jedna nebo více čárek uzavřených v hranatých závorkách

Následující příklady ukazují platné deklarace pole:

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

Neplatná délka pole

  • CS0248: Nelze vytvořit pole se zápornou velikostí
  • CS0270: Velikost pole nelze zadat v deklaraci proměnné (zkuste inicializovat pomocí výrazu new).
  • CS1586: Vytvoření pole musí mít velikost pole nebo inicializátor pole

Chcete-li vytvořit pole s platnými délkami, zadejte velikost během inicializace, nikoli deklaraci. Další informace naleznete v tématu Pole.

  • Zadejte délku pole jako součást inicializace, nikoli deklaraci (CS0270).
  • Pro dimenze pole (CS0248) používejte pouze kladná celá čísla.
  • Zadejte velikost ve výrazu new nebo inicializátoru pole (CS1586).

Následující příklad ukazuje oba mechanismy:

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

Neplatný typ elementu

  • CS0611: Prvky pole nemohou být typu 'type'
  • CS0719: Prvky pole nemohou být statického typu
  • CS0820: Nelze přiřadit inicializátor pole k implicitně zadanému místnímu prostředí
  • CS0826: Pro pole s implicitně zadaným typem nebyl nalezen žádný nejlepší typ

Chcete-li použít pole se správnými typy prvků, postupujte podle těchto omezení typů. Další informace najdete v tématu Implicitně zadané místní proměnné a nejlepší společný typ.

  • Nepoužívejte omezené typy jako System.TypedReferenceSystem.ArgIterator a jako typy prvků pole (CS0611).
  • Nepoužívejte static třídy jako typy elementů pole, protože instance nelze vytvořit (CS0719).
  • Inicializace implicitně zadaných polí pomocí výrazu new (CS0820).
  • Ujistěte se, že všechny prvky inicializátoru pole s implicitně zadaným typem mají nejlepší společný typ (CS0826).

Následující příklady ukazují, jak deklarovat implicitně typovaná pole:

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 };

Pokud chcete zajistit nejlepší běžný typ, použijte některou z těchto technik:

  • Dejte poli explicitní typ.
  • Udělte všem prvkům pole stejný typ.
  • Zadejte explicitní přetypování prvků, které mohou způsobovat problém.

Neplatný inicializátor pole

  • CS0623: Inicializátory polí lze použít pouze v inicializátoru proměnné nebo pole. Zkuste místo toho použít nový výraz.
  • CS0846: Očekává se inicializátor vnořeného pole
  • CS1925: Objekt typu type 'type' nelze inicializovat inicializátorem kolekce.

Tyto chyby označují neplatnou syntaxi inicializátoru pole. Další informace naleznete v tématu Pole.

Vytvoření platných inicializátorů pole:

  • Inicializátory pole používejte pouze v deklaraci proměnných nebo polí (CS0623). new Použijte výraz v jiných kontextech.
  • Vyvažte složené závorky ({ a }) kolem prvků nebo podřízených polí (CS0846)
  • Ujistěte se, že výraz inicializace odpovídá počtu polí v inicializaci zubatého pole.
  • Inicializátory kolekcí používejte pouze u typů kolekcí, ne u polí nebo jiných typů (CS1925).

Neplatný tvůrce kolekcí

  • CS9175: Strom výrazů nesmí obsahovat kolekční výraz.
  • CS9177: Návratový typ metody builderu 'CollectionBuilderAttribute' musí odpovídat typu kolekce použitému v 'betterness'.
  • CS9178: Pro přirozený typ "type" neexistuje žádný cílový typ.
  • CS9179: Typ výrazu kolekce musí mít použitelný konstruktor, který lze volat bez argumentů.
  • CS9180: Metoda Tvůrce CollectionBuilderAttribute musí být statickou metodou.
  • CS9181: Typ parametru metody Tvůrce CollectionBuilderAttribute musí odpovídat parametru ReadOnlySpan<{0}>.
  • CS9182: Neplatná 'CollectionBuilderAttribute'. Nebyla nalezena žádná odpovídající metoda '{0}' v tvůrci typu '{1}'.
  • CS9183: Návratový typ metody CollectionBuilderAttribute musí být ne abstraktní typ bez rozhraní, který lze použít jako "typ".
  • CS9185: Statický typ nelze použít jako argument typu.
  • CS9186: Název CollectionBuilderAttribute metody je neplatný.
  • CS9187: Nelze najít přístupnou metodu Create s očekávaným podpisem: statickou metodu s jedním parametrem typu ReadOnlySpan<{0}> a návratovým typem .{1}
  • CS9188: 'scoped' nelze použít jako modifikátor na parametr typu výrazu kolekce.
  • CS9190: Metoda CollectionBuilderAttribute builderMethod je nepoužitelná, protože je obecná.
  • CS9192: Řádkové převody polí nelze použít s kolekčními výrazy.
  • CS9193: Argument 'argument' nesmí být předán s klíčovým slovem 'ref'.
  • CS9194: Argument 'argument' nesmí být předán s klíčovým slovem out
  • CS9195: Argument 'argument' nesmí být předán s klíčovým slovem 'in'.
  • CS9196: Funkce 'kolekční výraz' není k dispozici v jazyce C# 'version'. Použijte prosím jazykovou verzi 'requiredVersion' nebo vyšší.
  • CS9197: Funkce 'inline arrays' není k dispozici ve verzi jazyka C# 'version'. Použijte prosím verzi jazyka 'requiredVersion' nebo vyšší.
  • CS9198: Funkce 'ref' a 'unsafe' v asynchronních a iterátorových metodách není dostupná ve verzi jazyka C# 'verze'. Použijte prosím jazykovou verzi 'požadovanáVerze' nebo vyšší.
  • CS9199: Výraz kolekce není k dispozici v jazyce C# 'version'. Použijte prosím jazykovou verzi 'requiredVersion' nebo vyšší.
  • CS9202: Funkce 'ref readonly parameters' není k dispozici v jazyce C# 'version'. Použijte prosím jazykovou verzi 'requiredVersion' nebo vyšší.
  • CS9208: Operátor nameof nelze použít pro přímý přístup k poli.
  • CS9209: Jako argument hodnoty nelze použít návratovou vlastnost "vlastnost".
  • CS9211: Výraz musí být typu "type", protože je přiřazen odkazem.
  • CS9212: Výraz kolekce nelze použít jako hodnotu v pevném příkazu
  • CS9217: Proměnná 'ref' nemůže být zachována přes hranici 'await' nebo 'yield'.
  • CS9218: "paramName" je odkazová struktura a nemůže být typem parametru.
  • CS9221: Typ "type" nemusí být odkazová struktura nebo parametr typu, který umožňuje použití struktury ref jako parametru "parameter" v obecném typu nebo metodě 'member'.
  • CS9223: Struktura, která obsahuje pole ref, nelze použít ve výrazu kolekce.
  • CS9228: Není povolena deklarace odkazové struktury bez proměnné.
  • CS9232: Částečné deklarace metody mají rozdíly v signaturách.
  • CS9233: Modifikátor "soubor" lze použít pouze u typů definovaných na nejvyšší úrovni v kompilační jednotce.

Chcete-li vytvořit výrazy kolekce s atributy tvůrce kolekcí správně, postupujte podle těchto požadavků. Další informace naleznete viz část Výrazy kolekce.

  • Ujistěte se, že cílový typ má typ iterace, který podporuje foreach (CS9188).
  • Nepoužívejte obecné typy jako typy tvůrce kolekcí (CS9185).
  • Ověřte platnost názvu metody zadaného v CollectionBuilderAttribute souboru (CS9186).
  • Použijte CollectionBuilderAttribute pouze u statických metod, které odpovídají požadovanému podpisu: vrátí typ kolekce a vezme ReadOnlySpan<T> parametr, který T odpovídá typu elementu (CS9180, CS9181, CS9182, CS9183, CS9187, CS9190).
  • Ujistěte se, že návratový typ odpovídá a není abstraktní typ nebo rozhraní (CS9177, CS9183).
  • Nepoužívejte struktury ref ani typy s poli ref ve výrazech kolekce (CS9218, CS9221, CS9223, CS9228).
  • Vyvarujte se používání kolekčních výrazů ve výrazových stromech (CS9175).
  • Pro výrazy kolekcí a související funkce (CS9196, CS9197, CS9198, CS9199, CS9202) použijte správnou jazykovou verzi.

Běžná upozornění specifikace jazyka

  • CS3007: Přetížená metoda „method“, která se liší pouze podle nepojmenovaných typů polí, není v souladu s CLS
  • CS3016: Použití polí jako argumentů atributů není kompatibilní s normou CLS

Pokud chcete psát kód kompatibilní se specifikací CLS s poli, postupujte podle těchto pokynů. Další informace naleznete v tématu Nezávislost jazyka.

  • Nevytvávejte přetížené metody, které se liší pouze v typech prvků pole (CS3007).
  • Nepoužívejte pole jako argumenty atributů (CS3016).

CS3007 nastane, pokud máte přetíženou metodu, která přebírá klikaté pole a jediný rozdíl mezi signaturami metod je typ prvku pole. Chcete-li se této chybě vyhnout, zvažte použití obdélníkového pole místo zahlceného pole nebo pokud není potřeba dodržování předpisů CLS, odeberte CLSCompliantAttribute atribut. Další informace o dodržování předpisů CLS naleznete v tématu Jazyková nezávislost a komponenty nezávislé na jazyce.

CS3016 označuje, že nevyhovuje specifikaci CLS (Common Language Specification) k předání pole atributu. Další informace o dodržování předpisů CLS najdete v tématu Nezávislost jazyka a komponenty nezávislé na jazyce.