Ř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.Index
neboSystem.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í polemref
. - Pole s jednou instancí není vyrovnávací pamětí pevné velikosti.
- Pole s jednou instancí nezahrnuje
required
modifikátory ,volatile
anireadonly
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.Index
neboSystem.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
, aSystem.Index
neboSystem.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žítReadOnlySpan<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.