Partager via


Résoudre les erreurs et les avertissements dans les déclarations de constructeur

Cet article décrit les erreurs de compilateur suivantes :

  • CS0514 : un constructeur statique ne peut pas avoir un appel explicite au constructeur 'this' ou 'base'.
  • CS0515: les modificateurs d’accès ne sont pas autorisés sur les constructeurs statiques.
  • CS0516 : Le constructeur 'constructor' ne peut pas s'appeler lui-même.
  • CS0517: 'class' n’a pas de classe de base et ne peut pas appeler un constructeur de base.
  • CS0522: les structs ne peuvent pas appeler des constructeurs de classe de base.
  • CS0526 : Les interfaces ne peuvent pas contenir de constructeurs.
  • CS0568 : Les structures ne peuvent pas contenir de constructeurs explicites sans paramètre.
  • CS0710: classes statiques ne peuvent pas avoir de constructeurs d’instances.
  • CS0768 : Un constructeur ne peut pas s'appeler lui-même par l'intermédiaire d'un autre constructeur.
  • CS8054 : Les enums ne peuvent pas contenir de constructeurs explicites sans paramètre.
  • CS8091: ne peut pas être externe et avoir une initialisation de constructeur.
  • CS8861 : liste d’arguments inattendue.
  • CS8862 :Un constructeur déclaré dans un type avec une liste de paramètres doit avoir l'initialisateur de constructeur « this ».
  • CS8358: Impossible d’utiliser le constructeur d’attribut, car il a des paramètres « in ».
  • CS8867: Aucun constructeur de copie accessible n'a été trouvé dans le type de base «{0}».
  • CS8868: Un constructeur de copie dans un enregistrement doit appeler un constructeur de copie de la base, ou un constructeur d’objet sans paramètre si l’enregistrement hérite de l’objet.
  • CS8878: Un constructeur de copie '{0}' doit être public ou protégé, car l’enregistrement n’est pas scellé.
  • CS8910: Le constructeur principal est en conflit avec le constructeur de copie synthétisé.
  • CS8958: le constructeur de struct sans paramètre doit être « public ».
  • CS8982: Un constructeur déclaré dans un « struct » avec la liste de paramètres doit avoir un initialiseur « this » qui appelle le constructeur principal ou un constructeur déclaré explicitement.
  • CS8983 : Une 'struct' avec des initialisateurs de champs doit inclure un constructeur explicitement déclaré.
  • CS9105: Impossible d’utiliser le paramètre de constructeur principal dans ce contexte.
  • CS9106 : l’identificateur est ambigu entre le type et le paramètre dans ce contexte.
  • CS9108: Impossible d’utiliser un paramètre de type ref à l’intérieur d’une méthode anonyme, d’une expression lambda, d’une expression de requête ou d’une fonction locale.
  • CS9109 : Impossible d’utiliser ref, outou in paramètre de constructeur principal à l’intérieur d’un membre d’instance.
  • CS9110: Impossible d’utiliser le paramètre de constructeur principal qui a un type de type ref-like à l’intérieur d’un membre d’instance.
  • CS9111: méthodes anonymes, expressions lambda, expressions de requête et fonctions locales à l’intérieur d’un membre d’instance d’une structure ne peuvent pas accéder au paramètre du constructeur principal.
  • CS9112: Les méthodes anonymes, les expressions lambda, les expressions de requête et les fonctions locales à l’intérieur d’une structure ne peuvent pas accéder au paramètre de constructeur principal également utilisé dans un membre d'instance.
  • CS9114 : Un paramètre de constructeur primaire d'un type en lecture seule ne peut pas être assigné (sauf dans le setter init-only du type ou dans un initialisateur de variable).
  • CS9115 : Un paramètre de constructeur primaire d'un type en lecture seule ne peut pas être retourné par une référence inscriptible.
  • CS9116 : Un paramètre de constructeur primaire d'un type en lecture seule ne peut pas être utilisé comme valeur ref ou out (sauf dans le setter init-only du type ou dans un initialisateur de variable).
  • CS9117 : Les membres d'un paramètre de constructeur primaire d'un type en lecture seule ne peuvent pas être modifiés (sauf dans le setter init-only du type ou dans un initialisateur de variable).
  • CS9118 : Les membres d'un paramètre de constructeur primaire d'un type en lecture seule ne peuvent pas être retournés par une référence inscriptible.
  • CS9119: Les membres d’un paramètre de constructeur principal d’un type en lecture seule ne peuvent pas être utilisés comme valeur ref ou out (sauf dans un setter défini uniquement lors de l'initialisation du type ou dans un initialiseur de variable).
  • CS9120: Impossible de renvoyer un paramètre du constructeur principal par référence.
  • CS9121 : Le paramètre primaire du constructeur d'une structure de type provoque un cycle dans la disposition de la structure.
  • CS9122: liste de paramètres inattendue.
  • CS9136 : Impossible d'utiliser un paramètre de constructeur primaire de type à l'intérieur d'un membre d'instance.

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

  • CS0824 : Le constructeur 'name' est marqué comme externe.
  • CS9107 : Le paramètre est capturé dans l'état du type englobant et sa valeur est également passée au constructeur de base. La valeur peut également être capturée par la classe de base.
  • CS9113: Paramètre n’est pas lus.
  • CS9124: Paramètre est capturé dans l’état du type englobant et sa valeur est également utilisée pour initialiser un champ, une propriété ou un événement.
  • CS9179 : Le paramètre du constructeur primaire est caché par un membre de la base.

Constructeurs statiques

  • CS0514 :Un constructeur statique ne peut pas avoir un appel explicite au constructeur 'this' ou 'base'.
  • CS0515 : Les modificateurs d'accès ne sont pas autorisés sur les constructeurs statiques.

Vous pouvez écrire au plus un constructeur statique pour un type. La déclaration d’un constructeur statique doit respecter les règles suivantes :

  • Le constructeur statique a le modificateur static, mais aucun autre modificateur, tel que public, protected, privateou internal.
  • Le constructeur statique doit être un constructeur sans paramètre.
  • Le constructeur statique ne doit pas appeler base() ou this(). Si la classe de base inclut un constructeur statique, le runtime l’appelle automatiquement.

Déclaration du constructeur

  • CS0526 : Les interfaces ne peuvent pas contenir de constructeurs.
  • CS0710 : classes statiques ne peuvent pas avoir de constructeurs d’instances.
  • CS8054 : Les énumérations ne peuvent pas contenir de constructeurs explicites sans paramètres.
  • CS8358: Impossible d’utiliser le constructeur d’attribut, car il a des paramètres « in ».
  • CS8091 : Un constructeur ne peut pas être extern et avoir un initialisateur de constructeur.

Les constructeurs sont autorisés uniquement dans les types class et struct, y compris les types record class et record struct. Vous ne pouvez pas les définir dans les types enum ou interface. En outre, les types de classe de l'attribut de la classe ne peuvent pas déclarer de paramètres in. Au lieu de cela, transmettez les paramètres par valeur.

Vous pouvez déclarer des constructeurs extern, mais vous ne pouvez pas utiliser les appels de constructeur base() ou this() pour appeler un autre constructeur à partir d'un constructeur déclaré extern.

En outre, les avertissements suivants peuvent être générés pour les déclarations de constructeur :

  • CS0824: Le constructeur est marqué comme externe.

Lorsqu’un constructeur est marqué extern, le compilateur ne peut pas garantir l’existence du constructeur. Par conséquent, le compilateur génère cet avertissement.

Constructeurs dans les types struct

  • CS0568 : les structures ne peuvent pas contenir de constructeurs explicites n’acceptant aucun paramètre.
  • CS8958 : Le constructeur d'une structure sans paramètre doit être « public ».
  • CS8982: Constructeur déclaré dans un « struct » avec la liste de paramètres doit avoir un initialiseur « this » qui appelle le constructeur principal ou un constructeur déclaré explicitement.
  • CS8983 : Une « struct » avec des initialisateurs de champs doit inclure un constructeur explicitement déclaré.

Les fonctionnalités récentes en C# suppriment les restrictions antérieures pour struct types. CS0568 est généré lorsque vous déclarez un constructeur d’instance sans paramètre dans les versions antérieures de C#. Vous pouvez déclarer un constructeur d’instance sans paramètre explicite dans les versions plus récentes de C#. Ce constructeur explicite sans paramètre doit être public. Si votre struct déclare des initialiseurs de champ , vous devez également déclarer un constructeur d’instance explicite. Ce constructeur peut être un constructeur sans paramètre avec un corps vide.

Lorsqu’un type struct déclare un constructeur principal, y compris record struct types, tous les autres constructeurs d’instance, sauf un constructeur sans paramètre, doivent appeler le constructeur principal ou un autre constructeur explicitement déclaré à l’aide de this().

Appels de constructeurs avec base et this

  • CS0516: Le constructeur ne peut pas s'appeler lui-même.
  • CS0517: Classe n’a pas de classe de base et ne peut pas appeler un constructeur de base.
  • CS0522: Les structures ne peuvent pas appeler les constructeurs de la classe de base.
  • CS0768: Un constructeur ne peut pas s'appeler lui-même par l'intermédiaire d'un autre constructeur.

Vous pouvez utiliser base() et this() pour qu'un constructeur en appelle un autre dans le même type ou dans le type de base. L'appel de constructeurs permet de minimiser la duplication de la logique des constructeurs. Vous devez respecter les règles suivantes lorsque vous appelez un autre constructeur à l'aide de this() ou base() :

  • Un constructeur ne peut pas s’appeler directement ou indirectement via un autre constructeur. Par exemple, le code suivant est illégal :

    public class C
    {
      public C() : this() // Error!
      {
      }
    }
    
    public class C2
    {
      public class C2() : this(10) {}
    
      public class C2(int capacity) : this() 
      {
          _capacity = capacity;
      }
    
      private int _capacity;
    }
    ``
    
    
  • Les types de structure ne peuvent pas appeler base(). Ni System.Objectne peut.

Enregistrements et constructeurs de copie

  • CS8867: Aucun constructeur de copie accessible n'a été trouvé dans le type de base.
  • CS8868: un constructeur de copie dans un enregistrement doit appeler un constructeur de copie de la base, ou un constructeur d’objet sans paramètre si l’enregistrement hérite de l’objet.
  • CS8878: Un constructeur de copie doit être public ou protégé, car l’enregistrement n’est pas scellé.
  • CS8910: Le constructeur primaire entre en conflit avec le constructeur de copie synthétisé.

L’ajout du modificateur record à un type struct ou class crée un enregistrement . Les enregistrements comprennent un constructeur de copie synthétisé par le compilateur. Vous pouvez écrire vous-même un constructeur de copie explicite, mais il doit respecter les règles suivantes :

  • Les constructeurs de copie doivent être public ou protected, sauf si le type est sealed.
  • Les constructeurs de copie doivent appeler le constructeur de copie base(), sauf si la classe de base est System.Object.
  • En outre, le type de base doit avoir un constructeur de copie. record ont toujours un constructeur de copies.

Déclaration du constructeur principal

Le compilateur émet les erreurs suivantes lorsqu’un constructeur principal enfreint une ou plusieurs règles sur les constructeurs principaux pour les classes et les structs :

  • CS8861 : liste d’arguments inattendue .
  • CS8862: Un constructeur déclaré dans un type avec une liste de paramètres doit avoir l'initialisateur de constructeur « this ».
  • CS9105: Impossible d’utiliser le paramètre de constructeur principal dans ce contexte.
  • CS9106: Identificateur est ambigu entre le type et le paramètre dans ce contexte.
  • CS9108: Impossible d’utiliser un paramètre qui a un type de type de type ref à l’intérieur d’une méthode anonyme, d’une expression lambda, d’une expression de requête ou d’une fonction locale.
  • CS9109 : Impossible d’utiliser ref, outou in paramètre de constructeur principal à l’intérieur d’un membre d’instance.
  • CS9110: Impossible d’utiliser le paramètre du constructeur principal qui a un type ressemblant à ref à l’intérieur d’un membre d’instance.
  • CS9111: Les méthodes anonymes, les expressions lambda, les expressions de requête et les fonctions locales à l’intérieur d’un membre d’instance d’une structure ne peuvent pas accéder au paramètre du constructeur principal.
  • CS9112: les méthodes anonymes, les expressions lambda, les expressions de requête et les fonctions locales à l'intérieur d'une structure ne peuvent pas accéder au paramètre de constructeur principal également utilisé à l'intérieur d'un membre d'instance.
  • CS9114: Un paramètre de constructeur primaire d'un type en lecture seule ne peut pas être assigné (sauf dans le setter init-only du type ou dans un initialisateur de variable).
  • CS9115: Un paramètre de constructeur primaire d'un type en lecture seule ne peut pas être renvoyé par une référence inscriptible.
  • CS9116: Un paramètre de constructeur principal d’un type en lecture seule ne peut pas être utilisé comme valeur ref ou out (sauf dans un setter uniquement pour l'initialisation du type ou dans l'initialisation d'une variable).
  • CS9117: Les membres du paramètre primaire du constructeur d'un type en lecture seule ne peuvent pas être modifiés (sauf dans le setter init-only du type ou dans un initialisateur de variable).
  • CS9118: Les membres d'un paramètre de constructeur primaire d'un type en lecture seule ne peuvent pas être retournés par une référence inscriptible.
  • CS9119: Les membres du paramètre de constructeur principal d’un type en lecture seule ne peuvent pas être utilisés comme valeurs ref ou out (sauf dans un setter d'initialisation uniquement du type ou d’un initialiseur de variable).
  • CS9120 : Il est impossible de retourner par référence le paramètre du constructeur principal.
  • CS9121: Le paramètre de type du constructeur primaire de la structure provoque un cycle dans l'agencement de la structure.
  • CS9122: liste de paramètres inattendue.
  • CS9124: Paramètre est capturé dans l’état du type englobant et sa valeur est également utilisée pour initialiser un champ, une propriété ou un événement.
  • CS9136: Impossible d'utiliser un paramètre de constructeur primaire de type à l'intérieur d'un membre d'instance.

Les paramètres du constructeur primaire sont dans la portée du corps de ce type. Le compilateur peut synthétiser un champ qui stocke le paramètre à utiliser dans les membres ou dans les initialiseurs de champ. Étant donné qu’un paramètre de constructeur principal peut être copié dans un champ, les restrictions suivantes s’appliquent :

  • Les constructeurs primaires peuvent être déclarés sur les types struct et class, mais pas sur les types interface.
  • Les paramètres du constructeur principal ne peuvent pas être utilisés dans un appel base(), sauf lorsqu'ils font partie du constructeur principal.
  • Les paramètres de constructeur principal de ref struct type ne sont pas accessibles dans les expressions lambda, les expressions de requête ou les fonctions locales.
  • Si le type n'est pas ref struct, les paramètres ref struct ne sont pas accessibles dans les membres de l'instance.
  • Dans un type ref struct, les paramètres du constructeur principal avec les modificateurs in, refou out ne peuvent pas être utilisés dans les méthodes d’instance ou les accesseurs de propriété.

Les types Struct ont les restrictions supplémentaires suivantes sur les paramètres des constructeurs primaires :

  • Les paramètres du constructeur principal ne peuvent pas être capturés dans des expressions lambda, des expressions de requête ou des fonctions locales.
  • Les paramètres du constructeur principal ne peuvent pas être retournés par référence (ref retour ou readonly ref retour).

Les types de struct en lecture seule ont les restrictions supplémentaires suivantes sur les paramètres du constructeur principal :

  • Les paramètres du constructeur principal et leurs membres ne peuvent pas être réaffectés dans un struct readonly.
  • Les paramètres du constructeur primaire et leurs membres ne peuvent pas être renvoyés ref dans une structure readonly.
  • Les paramètres du constructeur principal et leurs membres ne peuvent pas être des arguments ref ou out pour n'importe quelle méthode.

Dans tous ces cas, les restrictions sur les paramètres du constructeur principal sont cohérentes avec les restrictions sur les champs de données de ces types. Les restrictions sont dues au fait qu’un paramètre de constructeur principal peut être transformé en champ synthétisé dans le type. Par conséquent, les paramètres du constructeur principal doivent respecter les règles qui s’appliquent à ce champ synthétisé.

Un constructeur principal dérivé appelle le constructeur principal de base en fournissant les paramètres au constructeur de base. Vous devez utiliser les noms de paramètres de la déclaration du constructeur dérivé.

Les avertissements fournissent des indications sur les paramètres de constructeur primaire capturés ou masqués.

  • CS9107: Paramètre est capturé dans l’état du type englobant et sa valeur est également passée au constructeur de base. La valeur peut également être capturée par la classe de base. Cet avertissement indique que votre code peut être alloué deux copies d’un paramètre de constructeur principal. Étant donné que le paramètre est passé à la classe de base, la classe de base l’utilise probablement. Étant donné que la classe dérivée y accède, elle peut avoir une deuxième copie du même paramètre. Ce stockage supplémentaire peut ne pas être prévu.
  • CS9113: Paramètre n’est pas lu. Cet avertissement indique que votre classe ne fait jamais référence au constructeur principal, même pour le passer au constructeur principal de base. Il n’est probablement pas nécessaire.
  • CS9124: Paramètre est capturé dans l’état du type englobant et sa valeur est également utilisée pour initialiser un champ, une propriété ou un événement. Cet avertissement indique que le paramètre de constructeur d’un type imbriqué est également capturé par le type englobant. Le paramètre est probablement stocké deux fois.
  • CS9179: Le paramètre du constructeur principal est masqué par un membre de base