Udostępnij za pośrednictwem


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.Indexlub System.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 polem ref .
  • Pole pojedynczego wystąpienia nie jest buforem o stałym rozmiarze.
  • Pole pojedynczego wystąpienia nie zawiera requiredmodyfikatorów , volatileani readonly .
  • 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.Indexlub System.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, a System.Index lub System.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 zapisywalny Span<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.