Partager via


Résoudre les erreurs et les avertissements pour les déclarations littérales de chaîne

Le compilateur C# génère des erreurs et des avertissements lorsque vous déclarez des littéraux de chaîne avec une syntaxe incorrecte ou les utilisez dans des contextes non pris en charge. Ces diagnostics vous aident à identifier les problèmes liés aux littéraux de chaîne de base, aux littéraux de caractères, aux littéraux de chaîne bruts et aux littéraux de chaîne UTF-8.

  • CS1009 : séquence d’échappement non reconnue.
  • CS1010 : Nouvelle ligne en constante.
  • CS1011 : Littéral de caractère vide.
  • CS1012 : Trop de caractères dans le littéral de caractère.
  • CS1039 : Littéral de chaîne non terminé.
  • CS8996 : Les littéraux de chaîne brute ne sont pas autorisés dans les directives de préprocesseur.
  • CS8997 : littéral de chaîne brute non déterminée.
  • CS8998 : Guillemets de départ insuffisants pour ce contenu de chaîne brute.
  • CS8999 : La ligne ne commence pas par le même espace blanc que la ligne fermante du littéral de chaîne brute.
  • CS9000 : Le délimiteur littéral de chaîne brute doit être sur une ligne à part.
  • CS9001 : Les littéraux de chaîne brute à plusieurs lignes sont autorisés uniquement dans les chaînes interpolées verbatim.
  • CS9002 : les littéraux de chaîne brute à plusieurs lignes doivent contenir au moins une ligne de contenu.
  • CS9003 : La ligne contient des espaces blancs différents que prévu.
  • CS9004 : Guillemets insuffisants pour chaîne littérale brute.
  • CS9005 : Nombre insuffisant d'accolades fermantes pour la chaîne brute interpolée.
  • CS9006 : trop d’accolades ouvrantes pour un littéral de chaîne brute avec interpolation.
  • CS9007 : trop d’accolades fermantes pour le littéral de chaîne brut interpolé.
  • CS9008 : La séquence de caractères « @ » n’est pas autorisée.
  • CS9009 : La chaîne doit commencer par le caractère de guillemet.
  • CS9026 : La chaîne d’entrée ne peut pas être convertie en représentation d’octet UTF-8 équivalente.
  • CS9047 : L’opérateur ne peut pas être appliqué aux opérandes qui ne sont pas des représentations d’octetS UTF-8.
  • CS9274 : Impossible d’émettre ce littéral de chaîne dans la section de données, car il a une collision XXHash128 avec un autre littéral de chaîne.
  • CS9315 : La longueur combinée des chaînes utilisateur utilisées par le programme dépasse la limite autorisée. L’ajout d’un littéral de chaîne nécessite le redémarrage de l’application.

Littéraux de chaîne mal formés

  • CS1009 - Séquence d’échappement non reconnue.
  • CS1010 - Nouvelle ligne en constante.
  • CS1011 - Littéral de caractère vide.
  • CS1012 - Trop de caractères dans le littéral de caractère.
  • CS1039 - Littéral de chaîne non terminé.

Pour corriger ces erreurs, appliquez les techniques suivantes :

  • Utilisez l’une des séquences d’échappement standard définies dans la spécification du langage C#, par \n exemple (nouvelle ligne), \t (tabulation), \\ (barre oblique inverse) ou \" (guillemet double) (CS1009). Le compilateur ne reconnaît pas les séquences d’échappement qui ne font pas partie de la spécification du langage. Par conséquent, l’utilisation de séquences d’échappement non définies provoque cette erreur, car le compilateur ne peut pas déterminer le caractère que vous avez prévu représenter.
  • Ajoutez le caractère de guillemet fermant pour terminer votre littéral de chaîne (CS1039). Les littéraux de chaîne doivent avoir à la fois un délimiteur ouvrant et fermant, de sorte qu'une chaîne non terminée entraîne le traitement du code source suivant comme faisant partie du contenu de la chaîne, ce qui provoque des erreurs d'analyse.
  • Ajoutez exactement un caractère entre les guillemets simples dans votre littéral de caractère (CS1011, CS1012). Les littéraux de caractères représentent une valeur de caractère unique et doivent contenir exactement un caractère ou une séquence d’échappement valide, de sorte que les littéraux de caractères vides ou ceux contenant plusieurs caractères ne respectent pas les règles de langue du char type.
  • Fractionner les littéraux de chaîne qui s’étendent sur plusieurs lignes sources en terminant chaque ligne par un guillemet fermant et en commençant la ligne suivante par un guillemet ouvrant, en utilisant l’opérateur + pour les concaténer (CS1010). Les littéraux de chaîne standard ne peuvent pas contenir de caractères de nouvelle ligne réels, car le guillemet fermant doit apparaître sur la même ligne que le guillemet ouvrant, mais vous pouvez obtenir des chaînes à plusieurs lignes par concaténation ou à l’aide de chaînes détaillées ou de littéraux de chaîne bruts, ce qui autorise les nouvelles lignes incorporées dans le cadre du contenu de chaîne.

Pour plus d’informations, consultez strings.

Littéraux de chaîne brute mal formés

  • CS8996 - Les littéraux de chaîne brute ne sont pas autorisés dans les directives de préprocesseur.
  • CS8997 - Littéral de chaîne brute non déterminée.
  • CS8998 - Guillemets de départ insuffisants pour ce contenu de chaîne brute.
  • CS8999 - La ligne ne commence pas par le même espace blanc que la ligne fermante du littéral de chaîne brute.
  • CS9000 - Le délimiteur littéral de chaîne brut doit être sur sa propre ligne.
  • CS9001 - Les littéraux de chaîne brute à plusieurs lignes sont autorisés uniquement dans les chaînes verbatim interpolées.
  • CS9002 - Les littéraux de chaîne brute à plusieurs lignes doivent contenir au moins une ligne de contenu.
  • CS9003 - La ligne contient des espaces blancs différents que prévu.
  • CS9004 - Guillemets insuffisants pour le littéral de chaîne brute.
  • CS9005 - Pas assez d'accolades fermantes pour la chaîne brute interpolée littérale.
  • CS9006 - Trop d’accolades ouvrantes pour la chaîne littérale brute interpolée.
  • CS9007 - Trop d’accolades fermantes pour le littéral de chaîne brute interpolé.
  • CS9008 - La séquence de caractères « @ » n’est pas autorisée.
  • CS9009 - La chaîne doit commencer par le caractère de guillemet.

Pour corriger ces erreurs, appliquez les techniques suivantes :

  • Utilisez des littéraux de chaîne standard ou des littéraux de chaîne verbatim au lieu de littéraux de chaîne bruts dans des directives de préprocesseur telles que #if, #define, ou #pragma (CS8996). Les directives de préprocesseur sont évaluées pendant la phase de prétraitement avant l’analyse lexicale. Le compilateur ne peut donc pas reconnaître la syntaxe littérale de chaîne brute dans ces contextes, car les chaînes brutes sont identifiées pendant la phase d’analyse lexicale ultérieure.
  • Ajoutez un délimiteur fermant qui correspond au délimiteur ouvrant pour terminer votre littéral de chaîne brute (CS8997, CS9004). La syntaxe littérale de chaîne brute nécessite que les délimiteurs d’ouverture et de fermeture contiennent le même nombre de caractères de guillemets doubles consécutifs (au moins trois), de sorte qu’un délimiteur fermant manquant ou incompatible empêche le compilateur de déterminer où se termine le contenu de la chaîne.
  • Placez les délimiteurs ouvrants et fermants de littéraux de chaîne brutes multilignes sur leurs propres lignes, sans autre contenu sur ces lignes (CS9000). Les règles de format de chaîne brute à plusieurs lignes exigent que les délimiteurs occupent des lignes dédiées afin d’établir des limites claires pour le contenu de la chaîne et d’activer le comportement de découpage d’espace blanc qui supprime le retrait principal commun de toutes les lignes de contenu.
  • Ajoutez au moins une ligne de contenu entre les délimiteurs ouvrants et fermants de votre littéral de chaîne brute multiligne (CS9002). La spécification du langage nécessite que les chaînes brutes à plusieurs lignes contiennent du contenu réel, car les chaînes brutes à plusieurs lignes vides n’ont aucun but et indiquent probablement du code incomplet, tandis que les chaînes brutes à ligne unique (avec des délimiteurs sur la même ligne) peuvent être vides et sont la syntaxe appropriée pour les valeurs de chaîne vides.
  • Ajustez la mise en retrait de vos lignes de contenu de chaîne brute pour qu’elles correspondent ou dépassent la mise en retrait de la ligne de délimiteur fermante (CS8999, CS9003). Les règles de gestion des espaces blancs pour les littéraux de chaîne bruts utilisent l’espace blanc principal du délimiteur fermant comme ligne de base pour découper la mise en retrait commune de toutes les lignes de contenu, de sorte que les lignes de contenu avec moins de retrait que le délimiteur fermant violent cet algorithme de découpage et indiquent une mise en forme incorrecte.
  • Augmentez le nombre de guillemets doubles dans votre délimiteur de chaîne brute pour dépasser toute série consécutive de guillemets dans le contenu (CS8998). Le délimiteur doit contenir plus de guillemets consécutifs que n’importe quelle séquence dans le contenu de la chaîne afin que le compilateur puisse distinguer sans ambiguïté les guillemets qui font partie du contenu et la séquence de délimiteur qui marque la fin de la chaîne.
  • Pour les littéraux de chaîne brute interpolés, assurez-vous que le nombre de signes dollar ($) au début correspond au nombre d’accolades d’ouverture ou de fermeture consécutives dont vous avez besoin en tant que contenu littéral (CS9005, CS9006, CS9007). La syntaxe de chaîne brute interpolée utilise le nombre de signes dollar pour déterminer la longueur de la séquence d’échappement des accolades, ce qui signifie que $$""" nécessite {{ pour les trous d’interpolation et autorise des caractères { uniques en tant que contenu, tandis que les séquences d’accolades incompatibles indiquent soit une syntaxe d’interpolation incorrecte, soit un contenu qui nécessite un nombre différent de signes dollar.
  • Supprimez le préfixe @ de votre littéral de chaîne brute et n'utilisez que le délimiteur de guillemet (CS9008, CS9009). Les littéraux de chaîne bruts sont une syntaxe distincte introduite dans C# 11 qui n'utilise pas le préfixe de chaîne @ verbatim, et la spécification du langage n'autorise pas la combinaison de la syntaxe verbatim avec des délimiteurs @ de chaîne brute, car les chaînes brutes prennent déjà en charge le contenu multiligne et ne nécessitent pas de séquences d'échappement.

Note

CS9001 n’est plus produit dans les versions actuelles de C#. Les littéraux de chaîne brute à plusieurs lignes prennent désormais en charge l’interpolation sans nécessiter de format détaillé.

Pour plus d’informations, consultez littéraux de chaîne brutes.

Littéraux de chaîne UTF-8

  • CS9026 - La chaîne d’entrée ne peut pas être convertie en représentation d’octet UTF-8 équivalente.
  • CS9047 - L’opérateur ne peut pas être appliqué aux opérandes qui ne sont pas des représentations d’octetS UTF-8.

Pour corriger ces erreurs, appliquez les techniques suivantes :

  • Supprimez des caractères ou des séquences d’échappement qui ne peuvent pas être encodées dans UTF-8 de votre u8 littéral de chaîne (CS9026). La spécification d’encodage UTF-8 prend en charge le jeu de caractères Unicode complet, mais nécessite des valeurs scalaires Unicode valides. Par conséquent, les points de code de substitution (valeurs de la plage U+D800 à U+DFFF) ne peuvent pas apparaître directement dans les chaînes UTF-8, car ils sont réservés à l’encodage de paire de substitution UTF-16 plutôt que de représenter des caractères autonomes, et la tentative de les encoder en tant que séquence d’octets UTF-8 produirait une séquence d’octets non valide.
  • Vérifiez que les deux opérandes de l’opérateur d’ajout sont des littéraux de chaîne UTF-8 (marqués avec le u8 suffixe) lors de la concaténation de chaînes UTF-8 (CS9047). Le compilateur fournit une prise en charge spéciale de la concaténation des littéraux de chaîne UTF-8 au moment de la compilation, qui produit des ReadOnlySpan<byte> valeurs représentant les séquences d’octets UTF-8 concaténées, mais le mélange de chaînes UTF-8 avec des valeurs régulières string ou d’autres types n’est pas pris en charge, car le système de type ne peut pas déterminer s’il faut produire une étendue d’octets ou une chaîne de texte, et les représentations sous-jacentes (UTF-8 octets par rapport aux caractères UTF-16) sont fondamentalement incompatibles.

Pour plus d’informations, consultez littéraux de chaîne UTF-8.

Chaînes littérales dans les sections de données

  • CS9274 : Impossible d’émettre cette chaîne littérale dans la section de données, car elle a une collision XXHash128 avec une autre chaîne littérale.
  • CS9315 : La longueur combinée des chaînes utilisateur utilisées par le programme dépasse la limite autorisée. L’ajout d’un littéral de chaîne nécessite le redémarrage de l’application.

Pour résoudre ces problèmes, essayez les techniques suivantes :

  • Désactivez la fonctionnalité des littéraux de chaîne de la section de données expérimentales pour votre application lorsque vous rencontrez une collision de hachage (CS9274). Cette erreur indique que deux littéraux de chaîne différents ont produit la même valeur XXHash128, ce qui empêche l’optimisation de fonctionner correctement. Vous devez donc supprimer l’indicateur de fonctionnalité qui active ce comportement expérimental.
  • Redémarrez votre application après avoir modifié les littéraux de chaîne pendant une session de débogage lorsque la fonctionnalité de section de données est activée (CS9315). L’infrastructure de rechargement à chaud ne peut pas mettre à jour les littéraux de chaîne stockés dans la section de données, car ils sont incorporés dans un format spécial qui ne peut pas être modifié au moment de l’exécution, de sorte que la poursuite de l’exécution avec les anciennes valeurs de chaîne produirait un comportement incorrect.