Résoudre les erreurs et les avertissements dans les déclarations de groupe et des collections et les expressions d’initialisation

Cet article traite des erreurs suivantes du compilateur :

  • CS0022 : nombre d’index incorrect dans [], 'nombre' attendu
  • CS0178 : spécificateur de rang non valide : ',' ou ']' attendu
  • CS0248 : impossible de créer un tableau avec une taille négative
  • CS0270 : la taille du tableau ne peut pas être spécifiée dans une déclaration de variable (essayez d’initialiser avec une expression 'new')
  • CS0611 : les éléments de tableau ne peuvent pas être de type
  • CS0623 : les initialiseurs de tableau ne peuvent être utilisés que dans un initialiseur de champ ou de variable. Essayez plutôt d’utiliser une expression new.
  • CS0650 : déclarateur de tableau erroné : pour déclarer un tableau managé, le spécificateur de rang précède l’identificateur de la variable. Pour déclarer un champ de mémoire tampon de taille fixe, utilisez le mot clé corrigé avant le type de champ.
  • CS0719 : les éléments de tableau ne peuvent pas être de type statique
  • CS0747 : déclarateur de membre initialiseur non valide.
  • CS0820 : impossible d’affecter l’initialiseur de tableau à une variable locale implicitement typée
  • CS0826 : aucun meilleur type n’a été trouvé pour le tableau implicitement typé.
  • CS0846 : un initialiseur de tableau imbriqué est attendu
  • CS1552 : le spécificateur de type tableau, [], doit apparaître avant le nom de paramètre
  • CS1586 : la création de tableau doit posséder une taille de tableau ou un initialiseur de tableau
  • CS1920 : l’initialiseur d’élément ne peut pas être vide.
  • CS1921 : la meilleure méthode surchargée a une mauvaise signature pour l’initialisateur de collection. L’initialisable Add doit être une méthode d’instance accessible.
  • CS1925 : impossible d’initialiser l’objet de type 'type' avec un initialiseur de collection.
  • CS1954 : la meilleure méthode surchargée correspondant à l’élément initialisateur de la collection ne peut pas être utilisée. Les méthodes Add’ de l’initialiseur de collection ne peuvent pas avoir ref ou out paramètres.
  • CS9174 : impossible d’initialiser le type avec un littéral de collection, car le type n’est pas constructible.
  • CS9176 : il n’existe aucun type cible pour le littéral de collection.
  • CS9185 : le type de build CollectionBuilderAttribute doit être une classe ou un struct non générique.
  • CS9186 : le nom de la méthode CollectionBuilderAttribute n’est pas valide.
  • CS9187 : impossible de trouver une méthode accessible avec la signature attendue : une méthode statique avec un seul paramètre de type ReadOnlySpan<T> ; et un type de retour correct
  • CS9188 : le type a un CollectionBuilderAttribute, mais aucun type d’élément.
  • CS9203 : une expression de collection de ce type ne peut pas être utilisée dans ce contexte, car elle peut être exposée en dehors de l’étendue actuelle.
  • CS9210 : cette version System.Collections.Immutable.ImmutableArray<T>ne peut pas être utilisée avec des expressions de collection.

En outre, les avertissements suivants sont abordés dans cet article :

  • CS3007 : la méthode surchargée 'méthode' qui diffère uniquement par les types de tableau sans nom n'est pas conforme CLS
  • CS3016 : l’utilisation de tableaux en tant qu’arguments d’attributs n’est pas conforme CLS
  • CS0251 : indexation d’un tableau avec un index négatif (les index de tableau commencent toujours à zéro)
  • CS9208 : l’expression de collection peut entraîner des allocations de tas inattendues. Envisagez de créer explicitement un tableau, puis de convertir le type final pour rendre l’allocation explicite.
  • CS9209 : l’expression de collection peut entraîner des allocations de tas inattendues en raison de l’utilisation des répartisseurs '..'. Envisagez de créer explicitement un tableau, puis de convertir le type final pour rendre l’allocation explicite.

Vous pouvez en savoir plus sur les groupes, les initialiseurs de collection et les expressions de collection dans les articles suivants :

Initialiseur de collection non valide

Les erreurs suivantes indiquent que le code généré par le compilateur pour un initialiseur de collection n’est pas valide :

  • CS0747 : déclarateur de membre initialiseur non valide.
  • CS1920 : l’initialiseur d’élément ne peut pas être vide.
  • CS1921 : la meilleure méthode surchargée a une mauvaise signature pour l’initialisateur de collection. L’initialisable Add doit être une méthode d’instance accessible.
  • CS1954 : la meilleure méthode surchargée correspondant à l’élément initialisateur de la collection ne peut pas être utilisée. Les méthodes Add’ de l’initialiseur de collection ne peuvent pas avoir ref ou out paramètres.
  • CS9174 : impossible d’initialiser le type avec un littéral de collection, car le type n’est pas constructible.
  • CS9176 : il n’existe aucun type cible pour le littéral de collection.
  • CS9203 : une expression de collection de ce type ne peut pas être utilisée dans ce contexte, car elle peut être exposée en dehors de l’étendue actuelle.
  • CS9210 : cette version System.Collections.Immutable.ImmutableArray<T>ne peut pas être utilisée avec des expressions de collection.

Le compilateur peut également générer l’avertissement suivant :

  • CS9208 : l’expression de collection peut entraîner des allocations de tas inattendues. Envisagez de créer explicitement un tableau, puis de convertir le type final pour rendre l’allocation explicite.
  • CS9209 : l’expression de collection peut entraîner des allocations de tas inattendues en raison de l’utilisation des répartisseurs '..'. Envisagez de créer explicitement un tableau, puis de convertir le type final pour rendre l’allocation explicite.

Les erreurs indiquent toutes que le code généré par le compilateur pour un initialiseur de collection n’est pas valide. Vérifiez ce qui suit :

  • Un initialiseur de collection est constitué d’une séquence d’initialiseurs d’éléments. Vous ne pouvez pas combiner les propriétés de définition sur l’instance de collection avec l’ajout d’éléments dans le même initialiseur.
  • Un initialiseur de collection qui inclut des accolades ({ et }) ne peut pas être vide.
  • Une méthode Add conforme doit être accessible et prendre un paramètre qui est le même type que les éléments de collection. Le paramètre ne peut pas inclure le modificateur ref ou out.
  • La résolution de surcharge doit choisir une méthode Add comme meilleure correspondance. Il ne peut pas y avoir plusieurs méthodes de correspondance qui sont tout aussi bonnes.
  • Les expressions de collection peuvent initialiser des variables typées explicitement d’un type de collection. Si la variable n’est pas un type de collection ou de groupe, ou si elle est implicitement typée (à l’aide de var), un initialiseur de collection ne peut pas être utilisé.
  • Un type ref struct, comme System.Span<T> ne peut pas être initialisé avec une expression de collection qui peut violer la sécurité ref.
  • Une expression de collection ne peut pas initialiser correctement une System.Collections.Immutable.ImmutableArray<T> à l’aide de la version actuelle. Utilisez une autre version du runtime ou modifiez l’expression d’initialisation.

Les avertissements indiquent que l’expression de collection, y compris les éléments de répartition, peut allouer de la mémoire. Il est possible que la création de différents éléments de stockage et conversion soit plus efficace.

Initialiseur de groupe non valide

  • CS0623 : les initialiseurs de tableau ne peuvent être utilisés que dans un initialiseur de champ ou de variable. Essayez plutôt d’utiliser une expression new.
  • CS0846 : un initialiseur de tableau imbriqué est attendu
  • CS1925 : impossible d’initialiser l’objet de type 'type' avec un initialiseur de collection.

Ces erreurs indiquent que vous avez créé un initialiseur non valide. La cause probable est des accolades déséquilibrés { et } autour d’un ou plusieurs éléments ou groupes enfants. Assurez-vous que l’expression d’initialisation correspond au nombre de groupes dans une initialisation de tableau en escalier, et que les accolades sont équilibrées.

Accès invalide à un élément de groupe

  • CS0022 : nombre d’index incorrect dans [], 'nombre' attendu
  • CS0251 : indexation d’un tableau avec un index négatif (les index de tableau commencent toujours à zéro)

Vous accédez à un élément d’un groupe en spécifiant l’index pour chaque axe déclaré dans le groupe. Les index sont compris entre [ et ] après le nom du groupe. Il existe deux règles pour les index de groupe :

  1. Vous devez spécifier le même nombre d’index que celui utilisé dans la déclaration de groupe. Si le groupe a une dimension, vous devez spécifier un index. Si le groupe a trois dimensions, vous devez spécifier trois index.
  2. Tous les indices doivent être des nombres entiers non négatifs.

Ordre de priorité de groupe non valide

  • CS0178 : spécificateur de rang non valide : ',' ou ']' attendu
  • CS0650 : déclarateur de tableau erroné : pour déclarer un tableau managé, le spécificateur de rang précède l’identificateur de la variable. Pour déclarer un champ de mémoire tampon de taille fixe, utilisez le mot clé corrigé avant le type de champ.
  • CS1552 : le spécificateur de type tableau, [], doit apparaître avant le nom de paramètre

Une déclaration de groupe se compose des jetons suivants, dans l’ordre :

  1. Type des éléments du tableau. Par exemple, int, string ou SomeClassType.
  2. Les crochets de groupe, y compris éventuellement des virgules pour représenter plusieurs dimensions.
  3. Nom de la variable.

Quand une initialisation de groupe spécifie les dimensions du groupe, vous pouvez spécifier les propriétés suivantes :

  • Un certain nombre d’éléments entre accolades ({ et })
  • des crochets vides ;
  • Une ou plusieurs virgules entre crochets

Par exemple, les déclarations suivantes sont des déclarations de groupes valides :

int[] anArrayOfIntegers;
string[,,] threeDimensionalStringArray;

Pour plus d’informations, voir la section sur les initialisateurs de groupes de la spécification C# ( C# Language Specification).

Longueur de groupe non valide

  • CS0248 : impossible de créer un tableau avec une taille négative
  • CS0270 : la taille du tableau ne peut pas être spécifiée dans une déclaration de variable (essayez d’initialiser avec une expression 'new')
  • CS1586 : la création de tableau doit posséder une taille de tableau ou un initialiseur de tableau

La longueur de chaque dimension d’un groupe doit être spécifiée dans le cadre de l’initialisation du groupe, et non dans sa déclaration. La longueur de chaque dimension doit être positive. Vous pouvez spécifier la longueur à l’aide d’une expression new pour allouer le groupe ou à l’aide d’un initialiseur de groupe pour attribuer tous les éléments. L’exemple suivant montre deux mécanismes :

int[] fiveIntegers = new int[5];
string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

Type d’élément non valide

  • CS0611 :les éléments de tableau ne peuvent pas être de type 'type'
  • CS0719 : les éléments de tableau ne peuvent pas être de type statique
  • CS0820 : impossible d’affecter l’initialiseur de tableau à une variable locale implicitement typée
  • CS0826 : aucun meilleur type n’a été trouvé pour le tableau implicitement typé.

Certains types ne peuvent pas être appliqués à un tableau. Ces types incluent System.TypedReference et System.ArgIterator. Le type d’un groupe ne peut pas être une classe static , car les instances d’une classe static ne peuvent pas être créées.

Vous pouvez déclarer des groupes en tant que variables locales implicitement typées. Le groupe doit être initialisé à l’aide d’une expression new. En outre, tous les éléments d’un initialiseur de groupe doivent avoir un type le plus courant. Les exemples suivants montrent comment déclarer un groupe implicitement typé :

var implicitType = new[] { 1, 2, 3 };
        
char c = 'c';
short s1 = 0;
short s2 = -0;
short s3 = 1;
short s4 = -1;

// common type is "int"
var commonType = new[] { s1, s2, s3, s4, c, 1 };

Vous pouvez garantir le meilleur type commun à l’aide de l’une des techniques suivantes :

  • Donnez un type explicite au tableau.
  • Donnez le même type à tous les éléments de tableau.
  • Fournissez des casts explicites sur les éléments qui peuvent être à l’origine du problème.

Générateur de collections non valide

Les erreurs suivantes indiquent des erreurs dans votre type de générateur de collections :

  • CS9185 : le type de générateur CollectionBuilderAttribute doit être une classe ou un struct non générique.
  • CS9186 : le nom de la méthode CollectionBuilderAttribute n’est pas valide.
  • CS9187 : impossible de trouver une méthode accessible avec la signature attendue : une méthode statique avec un paramètre unique de type ReadOnlySpan<T> ; et un type de retour correct.
  • CS9188 : le type a un CollectionBuilderAttribute, mais n’a aucun type d’élément.

Ces erreurs indiquent que votre type de générateur de collections a besoin d’une modification. N’oubliez pas les règles suivantes :

  • le type de collection doit avoir un type d’itération. En d’autres termes, vous pouvez itérer (foreach) le type en tant que collection.
  • Le type du générateur de collections ne peut pas être un type générique.
  • Le nom de la méthode spécifié sur le System.Runtime.CompilerServices.CollectionBuilderAttribute doit être un nom de méthode valide. Par exemple, il ne peut pas être finaliseur ou un autre nom qui contient des caractères d’identificateur non valides.
  • La méthode du générateur de collections doit être une méthode statique accessible. Il doit renvoyer le type de collection et prendre un paramètre de ReadOnlySpan<T>T correspond au type d’élément de la collection.

Avertissements relatifs à la spécification du langage commun

  • CS3007 : la méthode surchargée 'méthode' qui diffère uniquement par les types de tableau sans nom n’est pas conforme CLS
  • CS3016 : l’utilisation de tableau en tant qu’arguments d’attributs n’est pas conforme CLS

CS3007 se produit lorsqu’une méthode surchargée accepte un tableau en escalier; la seule différence entre les signatures de méthodes réside dans le type d’élément du groupe. Pour éviter cette erreur, envisagez d’utiliser un groupe rectangulaire plutôt qu’un tableau en escalier ou, si la conformité au CLS n’est pas nécessaire, supprimez l’attribut CLSCompliantAttribute. Pour plus d’informations sur la conformité CLS, consultez Indépendance du langage et composants indépendants du langage.

CS3016 indique que le passage d’un tableau à un attribut n’est pas conforme à la spécification CLS (Common Language Specification). Pour plus d’informations sur la conformité CLS, consultez Indépendance du langage et composants indépendants du langage.