Usuwanie błędów i ostrzeżeń w deklaracjach tablic i kolekcjach oraz wyrażeniach inicjowania
W tym artykule opisano następujące błędy kompilatora:
- CS0022: Nieprawidłowa liczba indeksów wewnątrz [], oczekiwana liczba
- CS0178: Nieprawidłowy specyfikator rangi: oczekiwany "
,
" lub "]
" - CS0248: Nie można utworzyć tablicy o ujemnym rozmiarze
- CS0270: Nie można określić rozmiaru tablicy w deklaracji zmiennej (spróbuj zainicjować przy użyciu wyrażenia "
new
") - CS0611: Elementy tablicy nie mogą być typu
- CS0623: Inicjatory tablic mogą być używane tylko w inicjatorze zmiennych lub pól. Zamiast tego spróbuj użyć nowego wyrażenia.
- CS0650: Zły deklarator tablicy: aby zadeklarować tablicę zarządzaną, specyfikator rangi poprzedza identyfikator zmiennej. Aby zadeklarować pole bufora o stałym rozmiarze, użyj stałego słowa kluczowego przed typem pola.
- CS0719: Elementy tablicy nie mogą być typu statycznego
- CS0747: Nieprawidłowy deklarator elementu członkowskiego inicjatora.
- CS0820: Nie można przypisać inicjatora tablicy do niejawnie wpisanego lokalnego
- CS0826: Nie znaleziono najlepszego typu dla niejawnie typizowanej tablicy.
- CS0846: Oczekiwano zagnieżdżonego inicjatora tablicy
- CS1063: Najlepsza przeciążona metoda Add elementu inicjatora kolekcji jest przestarzała.
- CS1552: Specyfikator typu tablicy,
[]
, musi być wyświetlany przed nazwą parametru - CS1586: Tworzenie tablicy musi mieć rozmiar tablicy lub inicjator tablicy
- CS1920: Inicjator elementu nie może być pusty.
- CS1921: Najlepsze dopasowanie metody przeciążonej ma nieprawidłowy podpis dla elementu inicjatora. Inicjowanie
Add
musi być metodą wystąpienia dostępnego. - CS1925: Nie można zainicjować obiektu typu "type" za pomocą inicjatora kolekcji.
- CS1950: Najlepsza przeciążona metoda Add dla inicjatora kolekcji ma kilka nieprawidłowych argumentów.
- CS1954: Nie można użyć najlepszego przeciążonego dopasowania metody dla elementu inicjatora kolekcji. Metody inicjatora kolekcji "
Add
" nie mogą miećref
parametrów aniout
. - CS9174: Nie można zainicjować typu z literałem kolekcji, ponieważ typ jest nieskonstruowalny.
- CS9176: Nie ma typu docelowego literału kolekcji.
- CS9185: Typ konstruktora CollectionBuilderAttribute musi być klasą niegeneryjną lub strukturą.
- CS9186: Nazwa metody CollectionBuilderAttribute jest nieprawidłowa.
- CS9187: Nie można znaleźć dostępnej metody z oczekiwanym podpisem: metoda statyczna z pojedynczym parametrem typu
ReadOnlySpan<T>
; i poprawny typ zwracany - CS9188: Typ ma atrybut CollectionBuilderAttribute, ale nie ma typu elementu.
- CS9203: Nie można użyć wyrażenia kolekcji tego typu w tym kontekście, ponieważ może być uwidocznione poza bieżącym zakresem.
- CS9210: Nie można używać tej wersji System.Collections.Immutable.ImmutableArray<T>z wyrażeniami kolekcji.
Ponadto w tym artykule omówiono następujące ostrzeżenia:
- CS1062: Najlepsza przeciążona metoda Add elementu inicjatora kolekcji jest przestarzała.
- CS1064: Najlepsza przeciążona metoda Add elementu inicjatora kolekcji jest przestarzała.
- CS3007: Przeciążona metoda "method" różni się tylko według nienazwanych typów tablicy nie jest zgodna ze specyfikacją CLS
- CS3016: Tablice jako argumenty atrybutów nie są zgodne ze specyfikacją CLS
- CS0251: Indeksowanie tablicy z indeksem ujemnym (indeksy tablicy zawsze zaczynają się od zera)
- CS9208: Wyrażenie kolekcji może powodować nieoczekiwane alokacje sterty. Rozważ jawne utworzenie tablicy, a następnie przekonwertowanie na ostateczny typ w celu jawnego przydzielenia.
- CS9209: Wyrażenie kolekcji może powodować nieoczekiwane alokacje sterty ze względu na użycie spreadów "
..
". Rozważ jawne utworzenie tablicy, a następnie przekonwertowanie na ostateczny typ w celu jawnego przydzielenia.
Więcej informacji na temat tablic, inicjatorów kolekcji i wyrażeń kolekcji można dowiedzieć się w następujących artykułach:
Nieprawidłowy inicjator kolekcji
Następujące błędy wskazują, że kod wygenerowany przez kompilator inicjatora kolekcji jest nieprawidłowy:
- CS0747: Nieprawidłowy deklarator elementu członkowskiego inicjatora.
- CS1063: Najlepsza przeciążona metoda Add elementu inicjatora kolekcji jest przestarzała.
- CS1920: Inicjator elementu nie może być pusty.
- CS1921: Najlepsze dopasowanie metody przeciążonej ma nieprawidłowy podpis dla elementu inicjatora. Inicjowanie
Add
musi być metodą wystąpienia dostępnego. - CS1950: Najlepsza przeciążona metoda Add dla inicjatora kolekcji ma kilka nieprawidłowych argumentów.
- CS1954: Nie można użyć najlepszego przeciążonego dopasowania metody dla elementu inicjatora kolekcji. Metody inicjatora kolekcji "
Add
" nie mogą miećref
parametrów aniout
. - CS9174: Nie można zainicjować typu z literałem kolekcji, ponieważ typ jest nieskonstruowalny.
- CS9176: Nie ma typu docelowego literału kolekcji.
- CS9203: Nie można użyć wyrażenia kolekcji tego typu w tym kontekście, ponieważ może być uwidocznione poza bieżącym zakresem.
- CS9210: Nie można używać tej wersji System.Collections.Immutable.ImmutableArray<T>z wyrażeniami kolekcji.
Kompilator może również wygenerować następujące ostrzeżenie:
- CS1062: Najlepsza przeciążona metoda Add elementu inicjatora kolekcji jest przestarzała.
- CS1064: Najlepsza przeciążona metoda Add elementu inicjatora kolekcji jest przestarzała.
- CS9208: Wyrażenie kolekcji może powodować nieoczekiwane alokacje sterty. Rozważ jawne utworzenie tablicy, a następnie przekonwertowanie na ostateczny typ w celu jawnego przydzielenia.
- CS9209: Wyrażenie kolekcji może powodować nieoczekiwane alokacje sterty ze względu na użycie spreadów "
..
". Rozważ jawne utworzenie tablicy, a następnie przekonwertowanie na ostateczny typ w celu jawnego przydzielenia.
Wszystkie błędy wskazują, że kod wygenerowany przez kompilator inicjatora kolekcji jest nieprawidłowy. Sprawdź:
- Inicjator kolekcji zawiera sekwencję elementów. Nie można mieszać właściwości ustawień w wystąpieniu kolekcji z dodawaniem elementów w tym samym inicjatorze.
- Inicjator kolekcji zawierający nawiasy klamrowe (
{
i}
) nie może być pusty. - Klasa musi zaimplementować element IEnumerable i mieć metodę publiczną
Add
. - Metoda zgodna
Add
musi być dostępna i przyjmować jeden parametr, który jest tego samego typu co elementy kolekcji. Parametr nie może zawieraćref
modyfikatora aniout
. - Rozpoznawanie przeciążenia musi wybrać jedną
Add
metodę jako lepszą dopasowanie. Nie może istnieć wiele pasujących metod, które są równie dobre. - Wyrażenia kolekcji mogą inicjować jawnie typizowane zmienne typu kolekcji. Jeśli zmienna nie jest kolekcją lub typem tablicy lub jest niejawnie wpisywana (przy użyciu
var
), nie można użyć inicjatora kolekcji. - Typ
ref struct
, taki jak System.Span<T> nie można zainicjować za pomocą wyrażenia kolekcji, które może naruszać bezpieczeństwo ref. - Wyrażenie kolekcji nie może poprawnie zainicjować System.Collections.Immutable.ImmutableArray<T> obiektu przy użyciu bieżącej wersji. Użyj innej wersji środowiska uruchomieniowego lub zmień wyrażenie inicjowania.
Ostrzeżenia wskazują, że wyrażenie kolekcji, w tym wszystkie elementy rozłożone, mogą przydzielić pamięć. Tworzenie różnych magazynów i konwertowanie może być bardziej wydajne.
Nieprawidłowy inicjator tablicy
- CS0623: Inicjatory tablic mogą być używane tylko w inicjatorze zmiennych lub pól. Zamiast tego spróbuj użyć nowego wyrażenia.
- CS0846: Oczekiwano zagnieżdżonego inicjatora tablicy
- CS1925: Nie można zainicjować obiektu typu "type" za pomocą inicjatora kolekcji.
Te błędy wskazują, że utworzono nieprawidłowy inicjator. Prawdopodobną przyczyną jest niezrównoważone nawiasy klamrowe {
i }
wokół co najmniej jednego elementu lub tablic podrzędnych. Upewnij się, że wyrażenie inicjowania jest zgodne z liczbą tablic w inicjowaniu tablicy postrzępionej i że nawiasy klamrowe są zrównoważone.
Nieprawidłowy dostęp do elementu tablicy
- CS0022: Nieprawidłowa liczba indeksów wewnątrz [], oczekiwana liczba
- CS0251: Indeksowanie tablicy z indeksem ujemnym (indeksy tablicy zawsze zaczynają się od zera)
Uzyskujesz dostęp do elementu tablicy, określając indeks dla każdej osi zadeklarowanej w tablicy. Indeksy znajdują się między [
i ]
po nazwie tablicy. Istnieją dwie reguły dla indeksów tablicy:
- Należy określić tę samą liczbę indeksów, które są używane w deklaracji tablicy. Jeśli tablica ma jeden wymiar, musisz określić jeden indeks. Jeśli tablica ma trzy wymiary, należy określić trzy indeksy.
- Wszystkie indeksy muszą być nieujemne liczbami całkowitymi.
Nieprawidłowa ranga tablicy
- CS0178: Nieprawidłowy specyfikator rangi: oczekiwany "
,
" lub "]
" - CS0650: Zły deklarator tablicy: aby zadeklarować tablicę zarządzaną, specyfikator rangi poprzedza identyfikator zmiennej. Aby zadeklarować pole bufora o stałym rozmiarze, użyj stałego słowa kluczowego przed typem pola.
- CS1552: Specyfikator typu tablicy,
[]
, musi być wyświetlany przed nazwą parametru
Deklaracja tablicy składa się z następujących tokenów w kolejności:
- Typ elementów tablicy. Na przykład,
int
,string
lubSomeClassType
. - Nawiasy tablicowe, opcjonalnie łącznie z przecinkami reprezentującymi wiele wymiarów.
- Nazwa zmiennej.
Gdy inicjowanie tablicy określa wymiary tablicy, można określić następujące właściwości:
- Liczba elementów w nawiasach klamrowych (
{
i}
) - Puste nawiasy
- Co najmniej jedna przecinka ujęta w nawiasy
Na przykład następujące są prawidłowe deklaracje tablic:
int[] anArrayOfIntegers;
string[,,] threeDimensionalStringArray;
Aby uzyskać więcej informacji, zobacz sekcję Specyfikacja języka C# (Specyfikacja języka C#) w inicjatorach tablicy.
Nieprawidłowa długość tablicy
- CS0248: Nie można utworzyć tablicy o ujemnym rozmiarze
- CS0270: Nie można określić rozmiaru tablicy w deklaracji zmiennej (spróbuj zainicjować przy użyciu wyrażenia "new"
- CS1586: Tworzenie tablicy musi mieć rozmiar tablicy lub inicjator tablicy
Długość każdego wymiaru tablicy musi być określona w ramach inicjowania tablicy, a nie jej deklaracji. Długość każdego wymiaru musi być dodatnia. Długość można określić przy użyciu new
wyrażenia w celu przydzielenia tablicy lub przy użyciu inicjatora tablicy w celu przypisania wszystkich elementów. W poniższym przykładzie przedstawiono oba mechanizmy:
int[] fiveIntegers = new int[5];
string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
Nieprawidłowy typ elementu
- CS0611: Elementy tablicy nie mogą być typu "type"
- CS0719: Elementy tablicy nie mogą być typu statycznego
- CS0820: Nie można przypisać inicjatora tablicy do niejawnie wpisanego lokalnego
- CS0826: Nie znaleziono najlepszego typu dla niejawnie typizowanej tablicy.
Istnieją typy, których nie można użyć jako typu tablicy. Należą do System.TypedReference nich typy i System.ArgIterator. Typ tablicy nie może być klasą static
, ponieważ nie można utworzyć wystąpień static
klasy.
Tablice można zadeklarować jako niejawnie wpisane zmienne lokalne. Tablica musi zostać zainicjowana new
przy użyciu wyrażenia. Ponadto wszystkie elementy inicjatora tablicy muszą mieć najlepszy typ. W poniższych przykładach pokazano, jak zadeklarować niejawnie typizowane tablicy:
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 };
Aby zapewnić najlepszy typ typ, można użyć dowolnej z następujących technik:
- Nadaj tablicy jawny typ.
- Nadaj wszystkim elementom tablicy ten sam typ.
- Podaj jawne rzutowania na te elementy, które mogą powodować problem.
Nieprawidłowy konstruktor kolekcji
Następujące błędy wskazują błędy w typie konstruktora kolekcji:
- CS9185: Typ konstruktora
CollectionBuilderAttribute
musi być klasą niegeneryjną lub strukturą. - CS9186: Nazwa metody jest nieprawidłowa
CollectionBuilderAttribute
. - CS9187: Nie można znaleźć dostępnej metody z oczekiwanym podpisem: metoda statyczna z pojedynczym parametrem typu
ReadOnlySpan<T>
; i poprawny typ zwracany. - CS9188: Typ ma
CollectionBuilderAttribute
typ , ale nie ma typu elementu.
Te błędy wskazują, że typ konstruktora kolekcji wymaga modyfikacji. Pamiętaj o następujących regułach:
- Typ kolekcji musi mieć typ iteracji. Innymi słowy, można
foreach
wpisać jako kolekcję. - Typ konstruktora kolekcji nie może być typem ogólnym.
- Nazwa metody określona na obiekcie System.Runtime.CompilerServices.CollectionBuilderAttribute musi być prawidłową nazwą metody. Na przykład nie może być finalizatorem ani inną nazwą, która zawiera nieprawidłowe znaki identyfikatora.
- Metoda konstruktora kolekcji musi być dostępną metodą statyczną. Musi zwrócić typ kolekcji i musi mieć parametr
ReadOnlySpan<T>
, w którymT
jest zgodny z typem elementu kolekcji.
Ostrzeżenia specyfikacji języka wspólnego
- CS3007: Przeciążona metoda "method" różni się tylko według nienazwanych typów tablicy nie jest zgodna ze specyfikacją CLS
- CS3016: Tablice jako argumenty atrybutów nie są zgodne ze specyfikacją CLS
CS3007 występuje, jeśli istnieje przeciążona metoda, która przyjmuje tablicę postrzępionych, a jedyną różnicą między sygnaturami metody jest typ elementu tablicy. Aby uniknąć tego błędu, rozważ użycie tablicy prostokątnej, a nie tablicy postrzępionej lub, jeśli zgodność CLS nie jest potrzebna, usuń CLSCompliantAttribute atrybut. Aby uzyskać więcej informacji na temat zgodności clS, zobacz Niezależność języka i składniki niezależne od języka.
CS3016 wskazuje, że nie jest zgodna ze specyfikacją języka wspólnego (CLS), aby przekazać tablicę do atrybutu. Aby uzyskać więcej informacji na temat zgodności środowiska CLS, zobacz Niezależność języka i składniki niezależne od języka.