Résoudre les erreurs et les avertissements avec les déclarations de tableau inline
Cet article traite des erreurs et des avertissements suivants du compilateur :
- CS9164 : impossible de convertir l’expression en
Span<T>
car il ne s’agit pas d’une variable assignable - CS9165 : impossible de convertir l’expression en
ReadOnlySpan<T>
car elle ne peut pas être transmise ou retournée par référence - CS9166 : l’index se trouve en dehors des limites du tableau inlined
- CS9167 : la longueur du tableau inlined doit être supérieure à 0.
- CS9168 : le struct de tableau inlined ne doit pas avoir de layout explicite.
- CS9169 : le struct de tableau inlined ne doit déclarer qu’un seul champ d’instance qui ne doit pas être un champ de ref.
- CS9172 : les éléments d’un type de tableau inlined ne sont accessibles qu’avec un argument unique implicitement convertible en
int
,System.Index
ouSystem.Range
. - CS9173 : l’accès à un tableau inlined peut ne pas avoir de spécificateur d’argument nommé
- CS9180 : le champ d’élément de tableau inlined ne peut pas être déclaré comme nécessaire, en lecture seule, volatile ou comme mémoire tampon de taille fixe.
- CS9181 : l’indexeur de tableau inlined n’est pas utilisé pour l’expression d’accès aux éléments.
- CS9182 : la méthode « Slice » du tableau inlined n’est pas utilisée pour l’expression d’accès aux éléments.
- CS9183 : l’opérateur de conversion de tableau inlined n’est pas utilisé pour la conversion à partir de l’expression du type déclarant.
- CS9184 : la fonctionnalité de langage « tableaux inlined » n’est pas prise en charge pour les types de tableaux inlined avec un champ d’élément qui est un champ «
ref
» ou a un type qui n’est pas valide en tant qu’argument de type. - CS9189 : l’instruction
foreach
sur un tableau inlined de type n’est pas prise en charge
Déclaration de tableau inline
Vous déclarez des tableaux inline en tant que type struct
avec un champ unique et un attribut qui spécifie la longueur du tableau. Le compilateur génère les erreurs suivantes pour les déclarations de tableau inline non valides :
- CS9167 : la longueur du tableau inlined doit être supérieure à 0.
- CS9168 : le struct de tableau inlined ne doit pas avoir de layout explicite.
- CS9169 : Le struct de tableau inlined ne doit déclarer qu’un seul champ d’instance qui ne doit pas être un champ de ref.
- CS9180 : le champ d’élément de tableau inlined ne peut pas être déclaré comme nécessaire, en lecture seule, volatile ou comme mémoire tampon de taille fixe.
- CS9184 : la fonctionnalité de langage « tableaux inlined » n’est pas prise en charge pour les types de tableaux inlined avec un champ d’élément qui est un champ «
ref
» ou a un type qui n’est pas valide en tant qu’argument de type.
Pour corriger ces tableaux, vérifiez que les éléments suivants sont vrais :
- L’argument de System.Runtime.CompilerServices.InlineArrayAttribute est un entier positif.
- Le
struct
englobant ne spécifie aucun layout explicite. - Le
struct
englobant a un champ instance unique, et ce champ instance n’est pas un champref
. - Le champ d’instance unique n’est pas une mémoire tampon de taille fixe.
- Le champ d’instance unique n’inclut pas les modificateurs
required
,volatile
oureadonly
.
Accès aux éléments
Vous accédez aux éléments d’un tableau inline de la même manière qu’à n’importe quel tableau. Le compilateur émet les erreurs suivantes à partir d’un accès d’élément incorrect :
- CS9166 : l’index se trouve en dehors des limites du tableau inlined
- CS9172 : les éléments d’un type de tableau inlined ne sont accessibles qu’avec un argument unique implicitement convertible en
int
,System.Index
ouSystem.Range
. - CS9173 : l’accès à un tableau inlined peut ne pas avoir de spécificateur d’argument nommé
- CS9189 : l’instruction
foreach
sur un tableau inlined de type n’est pas prise en charge
En outre, le compilateur émet l’avertissement suivant lorsque vous déclarez un indexeur :
- CS9181 : l’indexeur de tableau inlined n’est pas utilisé pour l’expression d’accès aux éléments.
Le code généré d’une mémoire tampon inlined accède directement à la mémoire tampon, en contournant les indexeurs déclarés. Les tableaux inlined ne peuvent pas être utilisés avec l’instruction foreach
.
L’argument de l’indexeur doit être :
- L’un de ces trois types :
int
, unSystem.Index
ou unSystem.Range
. - Il ne peut pas s’agir d’un argument nommé. Le compilateur génère l’accesseur d’élément. Le paramètre n’ayant pas de nom, vous ne pouvez pas utiliser d’arguments nommés.
- Est inclus dans les limites du tableau. Comme tous les tableaux .NET, l’accès aux éléments de tableau inline est limité. L’index doit se trouver dans les limites du tableau inline.
Conversions en Span
Vous utiliserez souvent System.Span<T> ou System.ReadOnlySpan<T> pour travailler avec des tableaux inline. Le compilateur génère les erreurs suivantes pour les conversions non valides :
- CS9164 : impossible de convertir l’expression en
Span<T>
car il ne s’agit pas d’une variable assignable - CS9165 : impossible de convertir l’expression en
ReadOnlySpan<T>
car elle ne peut pas être transmise ou retournée par référence
Le compilateur génère du code qui accède directement à la mémoire d’une mémoire tampon inlined. Par conséquent, certains membres ne sont jamais appelés. Le compilateur génère les avertissements suivants si vous écrivez un des membres qui ne sont jamais appelés :
- CS9182 : la méthode « Slice » du tableau inlined n’est pas utilisée pour l’expression d’accès aux éléments.
- CS9183 : l’opérateur de conversion de tableau inlined n’est pas utilisé pour la conversion à partir de l’expression du type déclarant.
Un tableau inline peut être converti implicitement en Span<T>
ou ReadOnlySpan<T>
pour passer un tableau inline aux méthodes. Le compilateur applique des restrictions sur ces conversions :
- Le tableau inline doit être accessible en écriture pour convertir un tableau inline en
Span<T>
. Si le tableau est en lecture seule, vous ne pouvez pas le convertir en un tableau accessible en écritureSpan<T>
. Vous pouvez utiliserReadOnlySpan<T>
à la place. - Le contexte sécurisé du tableau inline doit être au moins aussi large que le contexte sécurisé du
Span<T>
ou duReadOnlySpan<T>
pour que la conversion réussisse. Vous devez soit limiter le contexte du Span, soit développer la portée du tableau inline.
En outre, le compilateur ne génère jamais d’appels à une méthode Slice
dans une mémoire tampon inlined. Les opérateurs de conversion pour convertir une mémoire tampon inlined en Span
ou ReadOnlySpan
ne sont pas appelés. Le compilateur génère du code pour créer System.Span<T> ou System.ReadOnlySpan<T> directement à partir de la mémoire tampon.