Usuwanie błędów i ostrzeżeń przy użyciu wbudowanych deklaracji tablicy
W tym artykule opisano następujące błędy i ostrzeżenia kompilatora:
- CS9164: Nie można przekonwertować wyrażenia na
Span<T>
, ponieważ nie jest to zmienna, do której można przypisać - CS9165: Nie można przekonwertować wyrażenia na
ReadOnlySpan<T>
, ponieważ może nie zostać przekazane lub zwrócone przez odwołanie - CS9166: Indeks znajduje się poza granicami tablicy wbudowanej
- CS9167: Długość tablicy wbudowanej musi być większa niż 0.
- CS9168: Śródliniowa struktura tablicy nie może mieć jawnego układu.
- CS9169: Struktura tablicy śródliniowej musi zadeklarować jedno i tylko jedno pole wystąpienia, które nie może być polem ref.
- CS9172: Dostęp do elementów typu tablicy wbudowanej można uzyskać tylko za pomocą jednego argumentu niejawnie konwertowanego na
int
,System.Index
lubSystem.Range
. - CS9173: Dostęp do tablicy wbudowanej może nie mieć nazwanego specyfikatora argumentów
- CS9180: Pole elementu tablicy wbudowanej nie może być zadeklarowane jako wymagane, odczytane, nietrwałe lub jako bufor o stałym rozmiarze.
- CS9181: Indeksator tablic wbudowanych nie będzie używany dla wyrażenia dostępu do elementów.
- CS9182: Metoda "Slice" tablicy wbudowanej nie będzie używana dla wyrażenia dostępu do elementów.
- CS9183: Operator konwersji tablicy wbudowanej nie będzie używany do konwersji z wyrażenia typu deklarowanego.
- CS9184: funkcja języka "Tablice wbudowane" nie jest obsługiwana w przypadku wbudowanych typów tablic z polem elementu, które jest polem "
ref
" lub ma typ, który jest nieprawidłowy jako argument typu. - CS9189:
foreach
instrukcja w wbudowanej tablicy typu nie jest obsługiwana - CS9259: Nie można zastosować atrybutu System.Runtime.CompilerServices.InlineArrayAttribute do struktury rekordów.
Deklaracja tablicy wbudowanej
Tablice wbudowane są deklarowane jako struct
typ z pojedynczym polem i atrybut określający długość tablicy. Kompilator generuje następujące błędy dla nieprawidłowych wbudowanych deklaracji tablicy:
- CS9167: Długość tablicy wbudowanej musi być większa niż 0.
- CS9168: Śródliniowa struktura tablicy nie może mieć jawnego układu.
- CS9169: Struktura tablicy śródliniowej musi zadeklarować jedno i tylko jedno pole wystąpienia, które nie może być polem ref.
- CS9180: Pole elementu tablicy wbudowanej nie może być zadeklarowane jako wymagane, odczytane, nietrwałe lub jako bufor o stałym rozmiarze.
- CS9184: funkcja języka "Tablice wbudowane" nie jest obsługiwana w przypadku wbudowanych typów tablic z polem elementu, które jest polem "
ref
" lub ma typ, który jest nieprawidłowy jako argument typu. - CS9259: Nie można zastosować atrybutu System.Runtime.CompilerServices.InlineArrayAttribute do struktury rekordów.
Aby naprawić te tablice, upewnij się, że spełnione są następujące warunki:
- Argumentem argumentu System.Runtime.CompilerServices.InlineArrayAttribute jest dodatnia liczba całkowita.
- Otaczanie
struct
nie określa żadnego jawnego układu. - Otaczające
struct
pole ma jedno wystąpienie, a to pole wystąpienia nie jest polemref
. - Pole pojedynczego wystąpienia nie jest buforem o stałym rozmiarze.
- Pole pojedynczego wystąpienia nie zawiera
required
modyfikatorów ,volatile
anireadonly
. - Usuń modyfikator z wbudowanej
record
deklaracji tablicy.
Dostęp do elementów
Uzyskujesz dostęp do elementów tablicy wbudowanej w taki sam sposób jak każda tablica. Kompilator emituje następujące błędy z nieprawidłowego dostępu do elementów:
- CS9166: Indeks znajduje się poza granicami tablicy wbudowanej
- CS9172: Dostęp do elementów typu tablicy wbudowanej można uzyskać tylko za pomocą jednego argumentu niejawnie konwertowanego na
int
,System.Index
lubSystem.Range
. - CS9173: Dostęp do tablicy wbudowanej może nie mieć nazwanego specyfikatora argumentów
- CS9189:
foreach
instrukcja w wbudowanej tablicy typu nie jest obsługiwana
Ponadto kompilator generuje następujące ostrzeżenie podczas deklarowania indeksatora:
- CS9181: Indeksator tablic wbudowanych nie będzie używany dla wyrażenia dostępu do elementów.
Wygenerowany kod buforu wbudowanego uzyskuje bezpośredni dostęp do pamięci buforu, pomijając wszystkie zadeklarowane indeksatory. Tablice wbudowane nie mogą być używane z instrukcją foreach
.
Argument indeksatora musi być następujący:
- Jeden z tych trzech typów:
int
, aSystem.Index
lubSystem.Range
. - Nie można być nazwanym argumentem. Kompilator generuje metodę dostępu do elementu. Parametr nie ma nazwy, więc nie można użyć nazwanych argumentów.
- Znajduje się w granicach tablicy. Podobnie jak wszystkie tablice platformy .NET, dostęp do wbudowanych elementów tablicy jest sprawdzany pod kątem granic. Indeks musi znajdować się w granicach tablicy wbudowanej.
Konwersje na zakres
Często używasz funkcji System.Span<T> lub System.ReadOnlySpan<T> do pracy z tablicami wbudowanymi. Kompilator generuje następujące błędy dla nieprawidłowych konwersji:
- CS9164: Nie można przekonwertować wyrażenia na
Span<T>
, ponieważ nie jest to zmienna, do której można przypisać - CS9165: Nie można przekonwertować wyrażenia na
ReadOnlySpan<T>
, ponieważ może nie zostać przekazane lub zwrócone przez odwołanie
Kompilator generuje kod, który bezpośrednio uzyskuje dostęp do pamięci dla wbudowanego buforu. W związku z tym niektórzy członkowie nigdy nie są wywoływani. Kompilator generuje następujące ostrzeżenia, jeśli napiszesz jeden z elementów członkowskich, które nigdy nie są wywoływane:
- CS9182: Metoda "Slice" tablicy wbudowanej nie będzie używana dla wyrażenia dostępu do elementów.
- CS9183: Operator konwersji tablicy wbudowanej nie będzie używany do konwersji z wyrażenia typu deklarowanego.
Tablica śródliniowa może być niejawnie konwertowana na tablicę Span<T>
śródliniową lub ReadOnlySpan<T>
w celu przekazania tablicy wbudowanej do metod. Kompilator wymusza ograniczenia dotyczące tych konwersji:
- Tablica śródliniowa musi być zapisywalna w celu przekonwertowania tablicy wbudowanej na tablicę
Span<T>
. Jeśli tablica jest czytelna, nie można przekonwertować jej na zapisywalnySpan<T>
element . Zamiast tego możesz użyćReadOnlySpan<T>
polecenia . - Bezpieczny kontekst tablicy wbudowanej musi być co najmniej tak szeroki, jak bezpieczny kontekst
Span<T>
elementu lubReadOnlySpan<T>
, aby konwersja zakończyła się pomyślnie. Należy ograniczyć kontekst zakresu lub rozwinąć zakres tablicy wbudowanej.
Ponadto kompilator nigdy nie generuje wywołań metody Slice
w buforze wbudowanym. Operatory konwersji w celu przekonwertowania buforu wbudowanego na element Span
lub ReadOnlySpan
nie są wywoływane. Kompilator generuje kod w celu utworzenia System.Span<T> obiektu lub System.ReadOnlySpan<T> bezpośrednio z buforu pamięci.