Partager via


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 ou System.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 champ ref.
  • 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 ou readonly.

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 ou System.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, un System.Index ou un System.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 écriture Span<T>. Vous pouvez utiliser ReadOnlySpan<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 du ReadOnlySpan<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.