Sdílet prostřednictvím


Řešení chyb a upozornění pomocí inline array deklarací

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

  • CS9164: Výraz nelze převést, Span<T> protože není přiřaditelnou proměnnou.
  • CS9165: Výraz nelze převést na ReadOnlySpan<T> , protože nemusí být předán nebo vrácen odkazem
  • CS9166: Index je mimo hranice vloženého pole
  • CS9167: Délka vložené matice musí být větší než 0.
  • CS9168: Vložená struktura pole nesmí mít explicitní rozložení.
  • CS9169: Vložená struktura pole musí deklarovat jedno a pouze jedno pole instance, které nesmí být ref pole.
  • CS9172: K prvkům vloženého typu pole lze přistupovat pouze s jedním argumentem implicitně konvertibilním na int, System.Indexnebo System.Range.
  • CS9173: Vložený přístup k poli nemusí mít specifikátor pojmenovaného argumentu
  • CS9180: Vložené pole prvku pole nelze deklarovat jako povinné, jen pro čtení, nestálé nebo jako vyrovnávací paměť s pevnou velikostí.
  • CS9181: Indexer vložené pole nebude použit pro výraz přístupu elementu.
  • CS9182: Metoda Vložené pole Slice se nepoužije pro výraz přístupu elementu.
  • CS9183: Operátor převodu vloženého pole nebude použit pro převod z výrazu deklarujícího typu.
  • CS9184: Funkce jazyka Vložená pole není podporována pro vložené typy polí s polem prvku, které je buď polem 'ref' nebo má typ, který není platný jako argument typu.
  • CS9189: foreach Příkaz vloženého pole typu není podporován.
  • CS9259: Atribut System.Runtime.CompilerServices.InlineArrayAttribute nelze použít u struktury záznamu.

Deklarace vložené matice

Vložená pole deklarujete jako struct typ s jedním polem a atribut, který určuje délku pole. Kompilátor generuje následující chyby pro neplatné vložené deklarace pole:

  • CS9167: Délka vložené matice musí být větší než 0.
  • CS9168: Vložená struktura pole nesmí mít explicitní rozložení.
  • CS9169: Vložená struktura pole musí deklarovat jedno a pouze jedno pole instance, které nesmí být ref pole.
  • CS9180: Vložené pole prvku pole nelze deklarovat jako povinné, jen pro čtení, nestálé nebo jako vyrovnávací paměť s pevnou velikostí.
  • CS9184: Funkce jazyka Vložená pole není podporována pro vložené typy polí s polem prvku, které je buď polem 'ref' nebo má typ, který není platný jako argument typu.
  • CS9259: Atribut System.Runtime.CompilerServices.InlineArrayAttribute nelze použít u struktury záznamu.

Pokud chcete tato pole opravit, ujistěte se, že jsou splněné následující podmínky:

  • Argumentem pro dané System.Runtime.CompilerServices.InlineArrayAttribute číslo je kladné celé číslo.
  • Uzavírací struct pole neurčí žádné explicitní rozložení.
  • Ohraničení struct obsahuje jedno pole instance a toto pole instance není polem ref .
  • Pole s jednou instancí není vyrovnávací pamětí pevné velikosti.
  • Pole s jednou instancí nezahrnuje requiredmodifikátory , volatileani readonly modifikátory.
  • record Odeberte modifikátor z vložené deklarace pole.

Přístup k elementům

K prvkům vloženého pole přistupujete stejným způsobem jako k libovolnému poli. Kompilátor generuje následující chyby z nesprávného přístupu k elementům:

  • CS9166: Index je mimo hranice vloženého pole
  • CS9172: K prvkům vloženého typu pole lze přistupovat pouze s jedním argumentem implicitně konvertibilním na int, System.Indexnebo System.Range.
  • CS9173: Vložený přístup k poli nemusí mít specifikátor pojmenovaného argumentu
  • CS9189: foreach Příkaz vloženého pole typu není podporován.

Kromě toho kompilátor vydá následující upozornění při deklaraci indexeru:

  • CS9181: Indexer vložené pole nebude použit pro výraz přístupu elementu.

Vygenerovaný kód vložené vyrovnávací paměti přistupuje přímo k paměti vyrovnávací paměti a obchází všechny deklarované indexery. Vložená pole nelze použít s příkazem foreach .

Argument indexeru musí být:

  • Jeden z těchto tří typů: int, a System.Index nebo System.Range.
  • Nemůže to být pojmenovaný argument. Kompilátor vygeneruje přístupový objekt elementu. Parametr nemá název, takže nemůžete použít pojmenované argumenty.
  • Je zahrnuta v mezích pole. Stejně jako u všech polí .NET je přístup k vloženým prvkům pole zaškrtnutý. Index musí být v mezích vloženého pole.

Převody na span

Často používáte System.Span<T> nebo System.ReadOnlySpan<T> pracujete s vloženými poli. Kompilátor generuje následující chyby pro neplatné převody:

  • CS9164: Výraz nelze převést, Span<T> protože není přiřaditelnou proměnnou.
  • CS9165: Výraz nelze převést na ReadOnlySpan<T> , protože nemusí být předán nebo vrácen odkazem

Kompilátor generuje kód, který přímo přistupuje k paměti pro vloženou vyrovnávací paměť. Někteří členové se proto nikdy nevolali. Kompilátor vygeneruje následující upozornění, pokud napíšete některý z členů, které se nikdy nevolá:

  • CS9182: Metoda Vložené pole Slice se nepoužije pro výraz přístupu elementu.
  • CS9183: Operátor převodu vloženého pole nebude použit pro převod z výrazu deklarujícího typu.

Vložené pole lze implicitně převést na vložené Span<T> pole nebo ReadOnlySpan<T> předat vložené pole metodám. Kompilátor vynucuje omezení těchto převodů:

  • Vložené pole musí být zapisovatelné, aby bylo možné převést vložené pole na Span<T>. Pokud je pole jen pro čtení, nemůžete ho převést na zapisovatelný Span<T>. Místo toho můžete použít ReadOnlySpan<T> .
  • Bezpečný kontext vloženého pole musí být alespoň tak široký, jako je bezpečný kontext ReadOnlySpan<T> Span<T> nebo aby byl převod úspěšný. Musíte buď omezit kontext rozsahu, nebo rozšířit rozsah vloženého pole.

Kompilátor navíc nikdy negeneruje volání Slice metody ve vložené vyrovnávací paměti. Převodní operátory pro převod vložené vyrovnávací paměti na vloženou Span vyrovnávací paměť nebo ReadOnlySpan nejsou volána. Kompilátor vygeneruje kód pro vytvoření System.Span<T> nebo System.ReadOnlySpan<T> přímo z vyrovnávací paměti.