Résolvez les avertissements liés à l’utilisation d’espaces de noms

Cet article traite des erreurs suivantes du compilateur :

  • CS0138 : Erreur :une directive utilisant un espace de noms ne peut être appliquée qu’aux espaces de noms ; 'type' est un type et non un espace de noms.
  • CS0431 : impossible d’utiliser l’alias 'identificateur' avec ::, car l’alias référence un type. Utilisez . à la place.
  • CS0432 : Erreur : alias 'identificateur' introuvable.
  • CS0576 : Erreur : l’espace de noms 'espace de noms' contient une définition en conflit avec l’alias 'identificateur'.
  • CS0687 : le qualificateur d’alias d’espace de noms :: est toujours résolu en type ou en espace de noms ; il est donc non conforme ici. Envisagez plutôt d’utiliser . à la place.
  • CS1529 : Erreur : une clause d’utilisation doit précéder tous les autres éléments définis dans l’espace de noms, à l’exception des déclarations d’alias externes.
  • CS1537 : Erreur : l’alias d’utilisation 'alias' est apparu précédemment dans cet espace de noms.
  • CS7000 : Erreur : utilisation inattendue d’un nom ayant un alias.
  • CS7007 : Erreur : une directive using static ne peut être appliquée qu’aux types. Envisagez plutôt d’utiliser une directive using namespace.
  • CS8083 : Erreur : un nom qualifié d’alias n’est pas une expression.
  • CS8085 : Erreur : une directive 'utilisation d’un élément statique' ne peut pas être utilisée pour déclarer un alias.
  • CS8914 : Erreur : une directive d’utilisation globale ne peut pas être utilisée dans une déclaration d’espace de noms.
  • CS8915 : Erreur : une directive d’utilisation globale doit précéder toutes les directives d’utilisation non globales.
  • CS9055 : Erreur : un type local de fichier ne peut pas être utilisé dans une directive 'utilisation statique globale'.
  • CS9130 : Erreur : l’utilisation de l’alias ne peut pas être un type ref.
  • CS9131 : Erreur : seul un alias d’utilisation peut être unsafe.
  • CS9132 : Erreur : l’utilisation de l’alias ne peut pas être un type référence pouvant accepter la valeur Null.
  • CS9133 : Erreur : le modificateur static doit précéder le modificateur unsafe.
  • CS9162 : le type n’est pas valide pour 'utilisation statique'. Seuls une classe, un struct, une interface, une énumération, un délégué ou un espace de noms peuvent être utilisés.

Et les avertissements du compilateur suivants :

  • CS0105 : Avertissement : la directive d’utilisation pour 'espace de noms' est apparue précédemment dans cet espace de noms.
  • CS0440 : Avertissement : la définition d’un alias nommé global n’est pas judicieuse dans la mesure où global:: fait toujours référence à l’espace de noms global et non à un alias.
  • CS8019 : Information : inutile d’utiliser la directive.
  • CS8933 : Information : la directive d’utilisation apparaissait auparavant sous la forme d’une directive globale d’utilisation.

Ces erreurs et avertissements indiquent que votre directive using n’est pas formée correctement. Les sections suivantes traitent de ces erreurs et de la façon de les corriger.

Directive d’utilisation

La directive using doit précéder tous les autres éléments d’une déclaration namespace ou avant les déclarations namespace du fichier. Si vous placez une directive using plus loin dans le fichier, le compilateur génère l’erreur CS1529 :

namespace UsingDirective;
public class MyClass
{
}

using System.Text.Json; // CS1529

Pour résoudre ce problème, déplacez les déclarations using en haut du fichier ou en haut de l’espace de noms :

using System.Text.Json;
namespace UsingDirective;
public class MyClass
{
}

Le compilateur génère l’avertissement CS8933, CS0105 ou le diagnostic CS8019 pour une directive using dupliquée dans une directive using ou global using. Vous pouvez supprimer les doublons.

La combinaison incorrecte d’une directive using avec les modificateurs static, global ou unsafe sur une directive using est abordée plus loin dans cet article.

Utilisation d’une directive statique

La directive using static importe les membres d’un type dans l’espace de noms actuel. L’exemple suivant importe les méthodes à partir de System.Console, comme WriteLine dans l’espace de noms actuel :

using static System.Console;

Le compilateur génère CS0138 si vous omettez le modificateur static :

using System.Console; // CS0138

Le compilateur génère CS7007 si vous incluez l’espace de noms static d’importation du modificateur au lieu d’un type :

using static System; // CS7007

Le compilateur émet CS9162 si le symbole n’est pas l’un des types appropriés.

Si vous combinez le modificateur static avec le modificateur unsafe dans une directive using, le modificateur static doit passer en premier :

using static unsafe UnsafeExamples.UnsafeType;

Directive using globale

Une directive global using importe l’espace de noms ou le type dans tous les fichiers sources du projet actuel :

global using System.Text;

Toutes les directives global using doivent précéder les directives non globales using dans ce fichier source et ne doivent pas être placées dans un namespace. Cela aboutit respectivement aux CS8915 et CS8914.

En outre, une directive static global using ne peut pas référencer un type de fichier local.

Qualificateur d’alias

Le qualificateur d’alias, ::, précède un alias d’espace de noms ou suit l’alias global. Si vous utilisez ::. doit être utilisé pour séparer des éléments d’un nom complet, le compilateur émet l’un des éléments CS0431, CS0432, CS0687, *CS7000, ou CS8083.

Dans tous les cas, remplacez le :: par le séparateur ..

En outre, si vous définissez un alias nommé global, le compilateur émet CS0440. L’alias global fait toujours référence à l’espace de noms global. La déclaration d’un alias pour cela ne fonctionne pas, et vous devez choisir un autre nom pour votre alias.

Conflits de noms d’alias

Vous pouvez déclarer un alias à un espace de noms ou à un type avec une directive d’utilisation :

using JSON = System.Text.Json;
using ValueMap = System.Collections.Generic.Dictionary<string, decimal>;
using TimedData = (System.DateTime timeRecorded, decimal value);

Vous devez essayer de créer un nom unique pour l’alias, le nom à gauche du signe = dans les exemples précédents. L’utilisation d’un nom qui est déjà mappé à un Type (par exemple Object) ou à un espace de noms (System) peut provoquer CS0576 ou CS1537.

Restrictions sur l’utilisation des alias

Avant C# 12, le langage imposait ces restrictions aux directives using qui créent un alias pour une déclaration de type :

  • Vous ne pouvez pas créer d’alias avec une directive using static :

    using static con = System.Console;
    using static unsafe ip = int*;
    

À compter de C# 12, ces restrictions sont introduites :

  • Vous ne pouvez pas utiliser les modificateurs in, ref ou out dans un alias à l’aide de :

    // All these are invalid
    using RefInt = ref int;
    using OutInt = out int;
    using InInt = in int;
    
  • Une directive d’utilisation unsafe doit spécifier un alias ou un static using :

    // Elsewhere:
    public namespace UnsafeExamples
    {
        public unsafe static class UnsafeType
        {
            // ...
        }
    }
    
    // Using directives:
    using unsafe IntPointer = int*;
    using static unsafe UnsafeExamples.UnsafeType;
    using unsafe UnsafeExamples; // not allowed
    
  • Vous ne pouvez pas créer d’alias pour un type référence pouvant accepter la valeur Null :

    using NullableInt = System.Int32?; // Allowed
    using NullableString = System.String?; // Not allowed