Résoudre les avertissements liés aux fonctionnalités et aux versions de langage
Cet article traite des avertissements suivantes du compilateur :
- CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058 :La fonctionnalité n’est pas disponible. Utilisez une version du langage plus récente.
- CS8058 : la fonctionnalité est expérimentale.
- CS8192 : la version de langage fournie n’est pas prise en charge ou n’est pas valide
- CS8303 : la version de langage spécifiée ne peut pas avoir de zéros non significatifs
- CS8304 : la version du compilateur est inférieure à la version du langage
- CS1738 : les spécifications relatives aux arguments nommés doivent apparaître une fois que tous les arguments fixes ont été spécifiés.
- CS8306 : le nom de l’élément de tuple est déduit.
- CS8314 : une expression de type ne peut pas être gérée par un modèle de type
- CS8371 :les attributs ciblant les champs pour les propriétés automatiques ne sont pas pris en charge dans la version de langage
- CS8401 : pour utiliser
@$
à la place de$@
dans le cadre d’une chaîne verbatim interpolée, utilisez une version de langage plus récente. - CS8511 : une expression de type ne peut pas être gérée par un modèle de type.
- CS8627 : un paramètre de type Nullable doit être connu pour être un type valeur ou un type référence non-nullable
- CS8630 : options pouvant accepter la valeur Null non valides. Utilisez une version du langage plus récente
- CS8652 : le modificateur n’est pas valide pour cet élément.
- CS8704 : le type n’implémente pas le membre d’interface. Elle ne peut pas implémenter implicitement un membre non public.
- CS8706 : le type ne peut pas implémenter le membre d’interface, car aucune fonctionnalité n’est disponible dans cette version.
- CS8904 : variance non valide : le paramètre de type doit être valide.
- CS8912 : l’héritage d’un enregistrement avec un « Object.ToString » sealed n’est pas pris en charge.
- CS8919 : Impossible d’implémenter le membre d’interface spécifié dans le type, car le runtime cible ne prend pas en charge les membres abstraits statiques dans les interfaces
- CS8929 : La méthode ne peut pas implémenter le membre d’interface dans le type, car le runtime cible ne prend pas en charge les membres abstraits statiques dans les interfaces.
- CS8957 : l’expression conditionnelle n’est pas valide dans la version de langage, car aucun type commun n’a été trouvé parmi les types.
- CS8967 : les nouvelles lignes à l’intérieur d’une chaîne interpolée non verbatim ne sont pas prises en charge en C#
- CS9014 : erreur : utilisation de la propriété éventuellement non attribuée. Effectuez une mise à niveau vers la propriété par défaut automatique.
- CS9015 : erreur : utilisation d’un champ potentiellement non assigné. Effectuez une mise à niveau vers le champ par défaut automatique.
- CS9016 : avertissement : utilisation de la propriété éventuellement non attribuée. Effectuez une mise à niveau vers la propriété par défaut automatique.
- CS9017 : avertissement : utilisation d’un champ potentiellement non assigné. Effectuez une mise à niveau vers le champ par défaut automatique.
- CS9064 : le runtime cible ne prend pas en charge les champs de référence.
- CS9103 : définition dans un module avec une version RefSafetyRulesAttribute non reconnue, attendant « 11 ».
- CS9171 : le runtime cible ne prend pas en charge les types de tableaux inclus.
- CS9194 : l'argument ne doit pas être passé avec le mot clé
ref
. Pour passer les argumentsref
aux paramètresin
, effectuez une mise à niveau du langage vers la version 12 ou ultérieure. - CS9202 : la fonctionnalité n’est pas disponible dans C# 12.0. Veuillez utiliser une version du langage plus récente
- CS9211 : l’argument diagnosticId de l’attribut « Expérimental » doit être un identificateur valide.
- CS9240 : le runtime cible ne prend pas en charge les génériques by-ref-like.
- CS9260 : La fonctionnalité n’est pas disponible en C# 13.0. Utilisez une version plus récente du langage*
De plus, les erreurs et avertissements suivants sont liés aux changements apportés à l’initialisation des structs dans les versions récentes :
- CS0171, CS8881 : Le champ de stockage de la propriété 'name' implémentée automatiquement doit être complètement affecté pour que le contrôle soit retourné à l’appelant.
- CS0188, CS8885 : L’objet 'this' ne peut pas être utilisé tant que tous ses champs n’ont pas été affectés
- CS0843, CS8880 : Le champ de stockage de la propriété 'name' implémentée automatiquement doit être complètement affecté pour que le contrôle soit retourné à l’appelant
- CS8305 : la fonctionnalité est utilisée à des fins d'évaluation uniquement. Elle sera peut-être changée ou supprimée au cours des prochaines mises à jour.
- CS9204 : le type est utilisé à des fins d'évaluation uniquement. Il sera peut-être changé ou supprimé au cours des prochaines mises à jour. Supprimez ce diagnostic pour continuer.
La cause de toutes ces erreurs et tous ces avertissements est la suivante : le compilateur installé prend en charge une version de C# plus récente que la version sélectionnée pour votre projet. Le compilateur C# peut se conformer à n’importe quelle version antérieure. Cela vous permet ainsi de valider la syntaxe par rapport à une version antérieure de C#, ou de faire face aux situations dans lesquelles votre projet doit prendre en charge des bibliothèques ou des runtimes plus anciens.
Il existe deux causes possibles pour ces erreurs et avertissements, et trois façons de les résoudre.
Mettre à jour votre framework cible
Le compilateur détermine une valeur par défaut en fonction de ces règles :
Cible | Version | Version du langage C# par défaut |
---|---|---|
.NET | 9.x | C# 13 |
.NET | 8.x | C# 12 |
.NET | 7.x | C# 11 |
.NET | 6.x | C# 10 |
.NET | 5.x | C# 9.0 |
.NET Core | 3.x | C# 8.0 |
.NET Core | 2.x | C# 7.3 |
.NET Standard | 2.1 | C# 8.0 |
.NET Standard | 2.0 | C# 7.3 |
.NET Standard | 1.x | C# 7.3 |
.NET Framework | all | C# 7.3 |
Si le framework sélectionné ne correspond pas à la version de langage nécessaire, vous pouvez mettre à niveau le framework cible.
Sélectionner la version de langage correspondante
Un framework cible plus ancien est peut-être sélectionné dans votre fichier projet. Si vous supprimez l’élément LangVersion
de votre fichier projet, le compilateur utilise la valeur par défaut listée dans la section précédente. Le tableau suivant montre toutes les versions actuelles du langage C#. Vous pouvez également spécifier une version de langage particulière pour permettre l’activation des fonctionnalités plus récentes.
Valeur | Signification |
---|---|
preview |
Le compilateur accepte toute la syntaxe de langage valide de la dernière préversion. |
latest |
Le compilateur accepte la syntaxe de la dernière version publiée du compilateur (versions mineures incluses). |
latestMajor ou default |
Le compilateur accepte la syntaxe de la dernière version principale publiée du compilateur. |
13.0 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 13 ou une version antérieure. |
12.0 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 12 ou inférieur. |
11.0 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 11 ou une version antérieure. |
10.0 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 10 ou une version antérieure. |
9.0 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 9 ou une version antérieure. |
8.0 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 8.0 ou une version antérieure. |
7.3 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 7.3 ou une version antérieure. |
7.2 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 7.2 ou une version antérieure. |
7.1 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 7.1 ou une version antérieure. |
7 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 7.0 ou une version antérieure. |
6 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 6.0 ou une version antérieure. |
5 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 5.0 ou une version antérieure. |
4 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 4.0 ou une version antérieure. |
3 |
Le compilateur accepte uniquement la syntaxe incluse dans C# 3.0 ou une version antérieure. |
ISO-2 ou 2 |
Le compilateur accepte uniquement la syntaxe incluse dans ISO/IEC 23270:2006 C# (2.0) |
ISO-1 ou 1 |
Le compilateur accepte uniquement la syntaxe incluse dans ISO/IEC 23270:2003 C# (1.0/1.2) |
Si vous souhaitez en savoir plus sur les versions de langage prises en charge pour chaque version de framework, consultez l’article Configurer la version de langage dans la section Référence du langage.
Éviter la fonctionnalité mise à jour
Si vous devez prendre en charge des bibliothèques ou des runtimes plus anciens, vous devrez peut-être éviter d’utiliser les fonctionnalités plus récentes.
Activer les fonctionnalités expérimentales
Les diagnostics des fonctionnalités expérimentales peuvent être désactivés pour utiliser la fonctionnalité expérimentale.
Avertissement
Les fonctionnalités expérimentales sont soumises à des modifications. Les API peuvent changer, ou elles peuvent être supprimées au cours des prochaines mises à jour. L’inclusion de fonctionnalités expérimentales est un moyen pour les auteurs de bibliothèques d’obtenir des commentaires sur les idées et les concepts pour le développement futur. Utilisez une prudence extrême lors de l’utilisation d’une fonctionnalité marquée comme expérimentale.
Vous pouvez également déclarer vos propres fonctionnalités expérimentales à l’aide de System.Diagnostics.CodeAnalysis.ExperimentalAttribute. Le compilateur émet CS9211 si l’identificateur utilisé pour la fonctionnalité expérimentale n’est pas un identificateur valide.
Changements cassants pour l’initialisation du struct
Toutes ces erreurs et tous ces avertissements permettent de garantir une initialisation correcte des types struct
avant l’accès à leurs champs. Dans les versions antérieures de C#, vous devez affecter explicitement tous les champs d’un struct dans un constructeur. Le constructeur sans paramètre initialise tous les champs à leur valeur par défaut. Dans les versions ultérieures, tous les constructeurs initialisent tous les champs. Le champ est explicitement défini, défini dans un initialiseur de champ ou défini avec sa valeur par défaut.
- CS0171, CS8881 : Le champ de stockage de la propriété 'name' implémentée automatiquement doit être complètement affecté pour que le contrôle soit retourné à l’appelant.
- CS0188, CS8885 : L’objet 'this' ne peut pas être utilisé tant que tous ses champs n’ont pas été affectés
- CS0843, CS8880 : Le champ de stockage de la propriété 'name' implémentée automatiquement doit être complètement affecté pour que le contrôle soit retourné à l’appelant
Vous pouvez résoudre cette erreur en mettant à niveau la version de langage vers C# 11, quand chaque constructeur struct
initialise tous les champs. Si cette option n’est pas possible, vous devez appeler explicitement le constructeur par défaut, comme le montre l’exemple suivant :
struct S
{
public int AIProp { get; set; }
public S(int i){} //CS0843
// Try the following lines instead.
// public S(int i) : this()
// {
// AIProp = i;
// }
}
class Test
{
static int Main()
{
return 1;
}
}