Ř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 element inicializátor kolekce je zastaralá.
- CS1552: Specifikátor typu pole,
[]
musí být uveden před názvem parametru. - CS1586: Vytvoření pole musí mít 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: Nejlepší přetížená metoda odpovídá elementu inicializátor kolekce nelze použít. Metody inicializátoru
Add
kolekce nemohou mítref
neboout
parametry. - CS9174: Nelze inicializovat typ s literálem kolekce, protože typ není konstruktovatelný.
- 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 kolekce tohoto typu nelze v tomto kontextu použít, protože může být vystaven mimo aktuální obor.
- CS9210: Tuto verzi System.Collections.Immutable.ImmutableArray<T>nelze použít s výrazy kolekce.
Kromě toho jsou v tomto článku popsána následující upozornění:
- CS1062: Nejlepší přetížená metoda Add pro element inicializátor kolekce je zastaralá.
- CS1064: Nejlepší přetížená metoda Add pro element inicializátor kolekce je zastaralá.
- CS3007: Přetížená metoda "method" se liší pouze podle nepojmenovaných typů polí není kompatibilní se specifikací CLS
- CS3016: Pole jako argumenty atributů nejsou kompatibilní 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 mít neočekávaný přidělení haldy kvůli použití rozpětí '
..
'. Zvažte explicitní vytvoření pole a následný převod na konečný typ, aby bylo přidělení explicitní.
Další informace o polích, inicializátorech kolekcí a výrazech kolekce najdete v následujících článcích:
Neplatný inicializátor kolekce
Následující chyby značí, že kód vygenerovaný kompilátorem pro inicializátor kolekce je neplatný:
- CS0747: Deklarátor člena inicializátoru je neplatný.
- CS1063: Nejlepší přetížená metoda Add pro element inicializátor kolekce je zastaralá.
- 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. - CS1950: Nejlepší přetížená metoda Add pro inicializátor kolekce má některé neplatné argumenty.
- CS1954: Nejlepší přetížená metoda odpovídá elementu inicializátor kolekce nelze použít. Metody inicializátoru
Add
kolekce nemohou mítref
neboout
parametry. - CS9174: Nelze inicializovat typ s literálem kolekce, protože typ není konstruktovatelný.
- 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 vystaven mimo aktuální obor.
- CS9210: Tuto verzi System.Collections.Immutable.ImmutableArray<T>nelze použít s výrazy kolekce.
Kompilátor může také vygenerovat následující upozornění:
- CS1062: Nejlepší přetížená metoda Add pro element inicializátor kolekce je zastaralá.
- CS1064: Nejlepší přetížená metoda Add pro element inicializátor 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 mít neočekávaný přidělení haldy kvůli použití rozpětí '
..
'. Zvažte explicitní vytvoření pole a následný převod na konečný typ, aby bylo přidělení explicitní.
Všechny chyby značí, že kód vygenerovaný kompilátorem pro inicializátor kolekce je neplatný. Zkontrolujte následující:
- Inicializátor kolekce obsahuje posloupnost prvků. U instance kolekce nelze kombinovat vlastnosti nastavení s přidáním prvků ve stejném inicializátoru.
- Inicializátor kolekce, který obsahuje složené závorky (
{
a}
) nemůže být prázdný. - Třída musí implementovat IEnumerable a mít veřejnou
Add
metodu. - Odpovídající
Add
metoda musí být přístupná a musí mít jeden parametr, který je stejného typu jako prvky kolekce. Parametr nemůže obsahovatref
aniout
modifikátor. - Rozlišení přetížení musí vybrat jednu
Add
metodu jako lepší shodu. Nemůže existovat více odpovídajících metod, které jsou stejně dobré. - Výrazy kolekce mohou inicializovat explicitně zadané proměnné typu kolekce. Pokud proměnná není kolekcí nebo typem pole nebo je implicitně zadána (pomocí
var
), nelze inicializátor kolekce použít. - Typ
ref struct
, například System.Span<T> nelze inicializovat výrazem kolekce, který může porušit bezpečnost ref. - Výraz kolekce nemůže správně inicializovat System.Collections.Immutable.ImmutableArray<T> pomocí aktuální verze. Použijte jinou verzi modulu runtime nebo změňte inicializační výraz.
Upozornění značí, že výraz kolekce, včetně všech prvků šíření, může přidělit paměť. Vytvoření jiného úložiště a převodu může být efektivnější.
Neplatný inicializátor pole
- CS0623: Inicializátory polí lze použít pouze v proměnné nebo inicializátoru 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 značí, že jste vytvořili neplatný inicializátor. Pravděpodobnou příčinou jsou nevyvážené složené závorky {
a }
kolem jednoho nebo více prvků nebo podřízených polí. Ujistěte se, že výraz inicializace odpovídá počtu polí v inicializaci jagged array a že jsou složené závorky vyváženy.
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)
K prvku pole se dostanete zadáním indexu pro každou osu deklarovanou v poli. Indexy jsou mezi [
a ]
za názvem pole. Pro indexy pole existují dvě pravidla:
- Je nutné zadat stejný počet indexů, kolik se používá v deklaraci pole. Pokud má pole jednu dimenzi, musíte zadat jeden index. Pokud má pole tři dimenze, musíte zadat tři indexy.
- Všechny indexy musí být nezáporná celá čísla.
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.
Deklarace pole se skládá z následujících tokenů v pořadí:
- Typ prvků pole. Například ,
int
,string
neboSomeClassType
. - Maticové hranaté závorky, volitelně včetně čárek představujících více dimenzí.
- Název proměnné.
Při inicializaci pole určuje rozměry pole, můžete zadat následující vlastnosti:
- Počet prvků ve složených závorkách (
{
a}
) - Prázdné závorky
- Nejméně jedna čárka uzavřená v hranatých závorkách
Například následující jsou platné deklarace pole:
int[] anArrayOfIntegers;
string[,,] threeDimensionalStringArray;
Další informace najdete v části Specifikace jazyka C# (Specifikace jazyka C#) v inicializátorech polí.
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
Délka každé dimenze pole musí být zadána jako součást inicializace pole, nikoli její deklarace. Délka každé dimenze musí být kladná. Délku můžete určit buď pomocí výrazu new
k přidělení pole, nebo pomocí inicializátoru pole přiřadit všechny prvky. 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 '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 implicitně napsané pole nebyl nalezen žádný nejlepší typ.
Existují některé typy, které nelze použít jako typ pole. Mezi tyto typy patří System.TypedReference a System.ArgIterator. Typ pole nemůže být static
třída, protože instance static
třídy nelze vytvořit.
Pole můžete deklarovat jako implicitně zadané místní proměnné. Pole musí být inicializováno pomocí výrazu new
. Kromě toho musí mít všechny prvky inicializátoru pole nejlepší společný typ. 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 };
Nejlepší běžný typ můžete zajistit pomocí některé z následujících technik:
- Dejte poli explicitní typ.
- Udělte všem prvkům pole stejný typ.
- Uveďte explicitní přetypování těchto prvků, které můžou problém způsobovat.
Neplatný tvůrce kolekcí
Následující chyby značí chyby v typu tvůrce kolekce:
- CS9185: Typ
CollectionBuilderAttribute
tvůrce musí být ne generická třída nebo struktura. - CS9186: Název
CollectionBuilderAttribute
metody je neplatný. - CS9187: Nelze najít přístupnou metodu s očekávaným podpisem: statickou metodu s jedním parametrem typu
ReadOnlySpan<T>
; a správný návratový typ. - CS9188: Typ má
CollectionBuilderAttribute
typ prvku, ale žádný typ prvku.
Tyto chyby značí, že váš typ tvůrce kolekcí vyžaduje úpravy. Zapamatujte si následující pravidla:
- Typ kolekce musí mít typ iterace. Jinými slovy, typ můžete
foreach
zadat jako kolekci. - Typ tvůrce kolekce nemůže být obecný typ.
- Název metody zadaný pro danou metodu System.Runtime.CompilerServices.CollectionBuilderAttribute musí být platným názvem metody. Nemůže být například finalizační nebo jiný název, který obsahuje neplatné znaky identifikátoru.
- Metoda tvůrce kolekcí musí být přístupná statická metoda. Musí vrátit typ kolekce a musí mít parametr, kde
ReadOnlySpan<T>
T
odpovídá typu elementu kolekce.
Běžná upozornění specifikace jazyka
- CS3007: Přetížená metoda "method" se liší pouze podle nepojmenovaných typů polí není kompatibilní se specifikací CLS
- CS3016: Pole jako argumenty atributů nejsou kompatibilní se specifikací CLS
CS3007 nastane, pokud máte přetíženou metodu, která přebírá jagged pole a jediný rozdíl mezi podpisy metody 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.