Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article traite des erreurs suivantes du compilateur :
- CS0181 : Le paramètre de constructeur d’attribut a un type, qui n’est pas un type de paramètre d’attribut valide
- CS0243 : L’attribut conditionnel n’est pas valide sur « method », car il s’agit d’une méthode de remplacement.
- CS0404 : L’attribut n’est pas valide sur ce type de déclaration.
- CS0415 : Cet attribut est valide uniquement sur un indexeur qui n’est pas une déclaration de membre d’interface explicite.
- CS0416 : « paramètre de type » : un argument d’attribut ne peut pas utiliser de paramètres de type.
- CS0447 : L’attribut ne peut pas être utilisé avec des arguments de type.
- CS0577 : L’attribut conditionnel n’est pas valide, car il s’agit d’un constructeur, d’un destructeur, d’un opérateur, d’une expression lambda ou d’une implémentation d’interface explicite.
- CS0578 : L’attribut conditionnel n’est pas valide sur « function », car son type de retour n’est pas void.
- CS0579 : Attribut dupliqué
- CS0582 : L’attribut conditionnel n’est pas valide sur les membres de l’interface.
- CS0592 : L’attribut n’est pas valide sur ce type de déclaration. Il n’est valide que sur des déclarations spécifiques.
- CS0609 : Impossible de définir l’attribut sur un indexeur marqué de remplacement.
- CS0616 : Le type n’est pas une classe d’attributs
- CS0625 : Le champ d’instance dans les types marqués avec StructLayout(LayoutKind.Explicit) doit avoir un attribut FieldOffset.
- CS0629 : Le membre conditionnel 'member' ne peut pas implémenter le membre de l’interface 'membre de classe de base' dans le type 'Type Name'.
- CS0636 : L’attribut FieldOffset ne peut être placé que sur les membres de types marqués avec le StructLayout(LayoutKind.Explicit).
- CS0637 : L’attribut FieldOffset n’est pas autorisé sur les champs statiques ou const.
- CS0641 : Cet attribut est valide uniquement sur les classes dérivées de System.Attribute'.
- CS0646 : Impossible de spécifier l’attribut DefaultMember sur un type contenant un indexeur.
- CS0647 : Attribut d’émission d’erreur
- CS0653 : Impossible d’appliquer la classe d’attribut 'class' car elle est abstraite.
- CS0657 : L’emplacement n’est pas un emplacement d’attribut valide pour cette déclaration. Les emplacements d’attribut valides pour cette déclaration sont répertoriés. Tous les attributs de ce bloc seront ignorés.
- CS0658 : L’emplacement n’est pas un emplacement d’attribut reconnu. Les emplacements d’attribut valides pour cette déclaration sont répertoriés. Tous les attributs de ce bloc seront ignorés.
- CS0668 : deux indexeurs ont des noms différents ; l’attribut IndexerName doit être utilisé avec le même nom sur chaque indexeur au sein d’un type
- CS0685 : Le membre conditionnel 'member' ne peut pas avoir de paramètre out.
- CS0735 : Type non valide spécifié comme argument pour l’attribut TypeForwardedTo
- CS0739 : TypeForwardedToAttribute en double
- CS1608 : l’attribut RequiredAttribute n’est pas autorisé sur les types C#
- CS1614 : Le nom de l’attribut est ambigu. Utilisez « @name » ou incluez explicitement le suffixe « Attribute ».
- CS1618 : Impossible de créer un délégué avec une méthode, car elle ou une méthode qu’elle substitue a un attribut conditionnel
- CS1667 : L’attribut n’est pas valide sur les accesseurs de propriété ou d’événement. Il n’est valide que sur des déclarations spécifiques.
- CS1689 : L’attribut n’est valide que sur les méthodes ou les classes d’attributs
- CS7014 : Les attributs ne sont pas valides dans ce contexte.
- CS7046 : Le paramètre d’attribut doit être spécifié.
- CS7047 : Le paramètre d’attribut 'parameter1' ou 'parameter2' doit être spécifié.
- CS7067 : Le paramètre du constructeur d’attribut est facultatif, mais aucune valeur de paramètre par défaut n’a été spécifiée.
- CS8959 : CallerArgumentExpressionAttribute ne peut pas être appliqué, car il n’existe aucune conversion standard de type1 en type2
- CS8960 : CallerArgumentExpressionAttribute appliqué au paramètre n’aura aucun effet. Elle est remplacée par CallerLineNumberAttribute.
- CS8961 : CallerArgumentExpressionAttribute appliqué au paramètre n’aura aucun effet. Elle est remplacée par CallerFilePathAttribute.
- CS8962 : CallerArgumentExpressionAttribute appliqué au paramètre n’aura aucun effet. Elle est remplacée par CallerMemberNameAttribute.
- CS8963 : CallerArgumentExpressionAttribute appliqué au paramètre n’aura aucun effet. Elle est appliquée avec un nom de paramètre non valide.
- CS8968 : un argument de type d’attribut ne peut pas utiliser les paramètres de type
- CS8970 : Le type ne peut pas être utilisé dans ce contexte, car il ne peut pas être représenté dans les métadonnées.
- CS9331 : L’attribut ne peut pas être appliqué manuellement.
Arguments et paramètres d’attribut
Vous voyez les erreurs suivantes lorsque vous utilisez des arguments d’attribut ou des paramètres de manière incorrecte :
- CS0181 : Le paramètre de constructeur d’attribut a un type, qui n’est pas un type de paramètre d’attribut valide
- CS0416 : « paramètre de type » : un argument d’attribut ne peut pas utiliser de paramètres de type.
- CS0447 : L’attribut ne peut pas être utilisé avec des arguments de type.
- CS0647 : Attribut d’émission d’erreur
- CS7046 : Le paramètre d’attribut doit être spécifié.
- CS7047 : Le paramètre d’attribut 'parameter1' ou 'parameter2' doit être spécifié.
- CS7067 : Le paramètre du constructeur d’attribut est facultatif, mais aucune valeur de paramètre par défaut n’a été spécifiée.
- CS8968 : un argument de type d’attribut ne peut pas utiliser les paramètres de type
- CS8970 : Le type ne peut pas être utilisé dans ce contexte, car il ne peut pas être représenté dans les métadonnées.
Pour corriger ces erreurs, suivez ces règles :
- Les paramètres du constructeur d’attribut doivent utiliser des types de paramètres d’attribut valides (CS0181). La spécification du langage C# limite les types de paramètres d’attribut aux types primitifs (
bool, ,byte,char,doublefloatintlong,shortetstring),object, ,System.Typeles types d’énumération et les tableaux unidimensionnels de ces types. Les pointeurs de fonction et d’autres types qui ne peuvent pas être représentés dans les métadonnées ne sont pas des types de paramètres d’attribut valides. - Les arguments d’attribut doivent être des valeurs constantes au moment de la compilation. Vous ne pouvez donc pas utiliser les paramètres de type comme arguments d’attribut (CS0416). Le compilateur doit résoudre les arguments d’attribut au moment de la compilation et les paramètres de type ne sont pas connus tant que le type générique n’est pas construit.
- Vous ne pouvez pas appliquer d’arguments de type à un attribut non générique (CS0447). Si une classe d’attribut n’est pas générique, son utilisation ne peut pas inclure d’arguments de type entre crochets.
- Toutes les valeurs passées à un constructeur d’attribut doivent être correctement mises en forme et dans la plage valide pour chaque paramètre (CS0647). Par exemple, une GuidAttribute chaîne de format GUID valide est requise.
- Vous devez fournir tous les paramètres d’attribut requis lorsque vous appliquez l’attribut (CS7046, CS7047). Vérifiez la signature du constructeur de l’attribut pour déterminer quels paramètres sont obligatoires et fournissez des arguments valides pour chaque paramètre.
- Lorsque vous définissez un attribut personnalisé avec des paramètres de constructeur facultatifs, spécifiez les valeurs par défaut pour ces paramètres (CS7067). Utilisez la syntaxe
parameterType parameterName = defaultValuedans le constructeur d’attribut afin que les appelants puissent omettre ces arguments. - Les arguments de type d’attribut générique doivent être des types concrets, et non des paramètres de type (CS8968). Le compilateur doit déterminer entièrement les arguments de type d’attribut générique au moment de la compilation. Par conséquent, les paramètres de type ouvert ne sont pas autorisés.
- Les types utilisés comme arguments d’attribut doivent être représentés dans les métadonnées (CS8970). Certains types construits, tels que ceux impliquant
dynamicou certains noms d’éléments tuple, ne peuvent pas être encodés dans les métadonnées et ne sont pas autorisés en tant qu’arguments de type d’attribut.
Pour plus d’informations, consultez la section Attributs, Génériques et spécification du langage C# sur les attributs.
Note
CS0447 et CS0647 sont déconseillés. Le compilateur actuel n’émet pas ces erreurs.
Conditions requises pour la classe d’attribut
Vous voyez les erreurs suivantes lorsque vous définissez des classes d’attribut qui ne répondent pas aux contraintes requises :
- CS0404 : L’attribut n’est pas valide sur ce type de déclaration.
- CS0579 : Attribut dupliqué
- CS0616 : Le type n’est pas une classe d’attributs
- CS0641 : Cet attribut est valide uniquement sur les classes dérivées de System.Attribute'.
- CS0653 : Impossible d’appliquer la classe d’attribut 'class' car elle est abstraite.
- CS1614 : Le nom de l’attribut est ambigu. Utilisez « @name » ou incluez explicitement le suffixe « Attribute ».
Pour corriger ces erreurs, suivez ces règles :
- Appliquez des attributs uniquement aux types de déclaration autorisés par l’attribut AttributeUsageAttribute (CS0404). Vérifiez la
AttributeTargetsvaleur spécifiée dans les attributsAttributeUsagepour voir quelles cibles sont valides. - Si vous appliquez le même attribut plusieurs fois à une seule cible, supprimez le doublon ou défini
AllowMultiple = truedans l’attribut AttributeUsageAttribute (CS0579). Par défaut, les attributs ne peuvent apparaître qu’une seule fois sur chaque cible. - Le type utilisé dans la syntaxe d’attribut doit hériter de System.Attribute (CS0616). Seules les classes dérivées de
System.Attributepeuvent être utilisées comme attributs. D’autres types provoquent cette erreur même s’ils ont un nom similaire. - Vous ne pouvez s’appliquer AttributeUsageAttribute qu’aux classes qui dérivent de
Attribute(CS0641). L’attributAttributeUsagecontrôle la façon dont d’autres attributs sont utilisés et est lui-même limité aux classes d’attributs. - Les classes d’attribut ne peuvent pas être
abstractparce que le compilateur doit les instancier (CS0653). Supprimez leabstractmodificateur de la classe d’attributs ou dérivez une classe concrète de la base abstraite. - Quand les classes d’attributs
ExampleetExampleAttributeexistent toutes les deux, le compilateur ne peut pas déterminer celle à laquelle[Example]fait référence (CS1614). Désambiguez à l’aide[@Example]du nom plus court ou[ExampleAttribute]du nom plus long.
Pour plus d’informations, consultez Créer des attributs personnalisés et la section spécification du langage C# sur les attributs.
Contexte d’emplacement d’attribut
Les erreurs suivantes se produisent lorsque vous appliquez des attributs dans des emplacements non valides ou utilisez des spécificateurs cibles incorrects :
- CS0592 : L’attribut n’est pas valide sur ce type de déclaration. Il n’est valide que sur des déclarations spécifiques.
- CS0657 : L’emplacement n’est pas un emplacement d’attribut valide pour cette déclaration. Les emplacements d’attribut valides pour cette déclaration sont répertoriés. Tous les attributs de ce bloc seront ignorés.
- CS0658 : L’emplacement n’est pas un emplacement d’attribut reconnu. Les emplacements d’attribut valides pour cette déclaration sont répertoriés. Tous les attributs de ce bloc seront ignorés.
- CS1667 : L’attribut n’est pas valide sur les accesseurs de propriété ou d’événement. Il n’est valide que sur des déclarations spécifiques.
- CS7014 : Les attributs ne sont pas valides dans ce contexte.
Pour corriger ces erreurs, suivez ces règles. Pour plus d’informations, consultez la section Cibles d’attribut et la section spécification du langage C# sur la spécification d’attribut.
- Chaque attribut spécifie les types de déclaration qu’il AttributeUsageAttribute cible. Vous devez appliquer l’attribut uniquement à ces types (CS0592). Par exemple, vous ne pouvez pas appliquer un attribut défini avec
AttributeTargets.Interfaceà une classe. - Lorsque vous utilisez un spécificateur cible d’attribut tel que
method:ouproperty:, le spécificateur doit être valide pour la déclaration où il apparaît (CS0657). Vérifiez le message d’erreur pour voir quels spécificateurs cibles sont autorisés pour la déclaration spécifique. - Le spécificateur cible d’attribut que vous avez utilisé n’est pas un spécificateur reconnu (CS0658). Les spécificateurs valides incluent
assembly:, ,module:type:,method:property:field:event:param:et .return: - Certains attributs, tels que ObsoleteAttribute et CLSCompliantAttribute, ne sont pas valides sur les accesseurs de propriété ou d’événement (CS1667). Déplacez l’attribut de l’accesseur vers la déclaration elle-même de la propriété ou de l’événement.
- Les attributs ne peuvent apparaître que sur les éléments de programme qui les prennent en charge (CS7014). Si vous appliquez des attributs au niveau de l'assembly ou au niveau du module, utilisez les spécificateurs de cible
assembly:oumodule:et placez-les en haut du fichier.
Attributs prédéfinis
Les erreurs suivantes se produisent lorsque vous utilisez des attributs .NET prédéfinis spécifiques de manière incorrecte :
- CS0415 : Cet attribut est valide uniquement sur un indexeur qui n’est pas une déclaration de membre d’interface explicite.
- CS0609 : Impossible de définir l’attribut sur un indexeur marqué override.
- CS0625 : Le champ d’instance dans les types marqués avec StructLayout(LayoutKind.Explicit) doit avoir un attribut FieldOffset.
- CS0636 : L’attribut FieldOffset ne peut être placé que sur les membres de types marqués avec le StructLayout(LayoutKind.Explicit).
- CS0637 : L’attribut FieldOffset n’est pas autorisé sur les champs statiques ou const.
- CS0646 : Impossible de spécifier l’attribut DefaultMember sur un type contenant un indexeur.
- CS0668 : deux indexeurs ont des noms différents ; l’attribut IndexerName doit être utilisé avec le même nom sur chaque indexeur au sein d’un type
- CS0735 : Type non valide spécifié comme argument pour l’attribut TypeForwardedTo
- CS0739 : TypeForwardedToAttribute en double
- CS1608 : l’attribut RequiredAttribute n’est pas autorisé sur les types C#
- CS9331 : L’attribut ne peut pas être appliqué manuellement.
Pour corriger ces erreurs, suivez ces règles. Pour plus d’informations, consultez Indexeurs, Types de structureTypeForwardedToAttribute et Appel de plateforme (P/Invoke).
- Il IndexerNameAttribute ne peut être appliqué qu’aux indexeurs qui ne sont pas des déclarations de membre d’interface explicites (CS0415). Supprimez l’attribut des indexeurs d’interface explicites, car l’interface définit déjà le nom de l’indexeur.
- Vous ne pouvez pas appliquer
IndexerNameaux indexeurs marqués avecoverride, car les indexeurs de remplacement héritent de leur nom de la classe de base (CS0609). Supprimez l’attributIndexerNamede l’indexeur de remplacement. - Chaque champ d’instance d’un type marqué avec
StructLayout(LayoutKind.Explicit)doit avoir un FieldOffsetAttribute (CS0625). La disposition explicite nécessite que vous spécifiiez le décalage d’octet pour chaque champ d’instance. -
FieldOffsetAttribute ne peut être placé que sur des membres de types dont StructLayoutAttribute est défini à
LayoutKind.Explicit(CS0636). Ajoutez l’attributStructLayoutà la déclaration de type conteneur. - L’attribut
FieldOffsetn’est pas autorisé sur les champsstaticouconstcar la mise en page explicite s’applique uniquement aux champs d’instance (CS0637). Supprimez l’attributFieldOffsetdu champ statique ou const. - Vous ne pouvez pas appliquer DefaultMemberAttribute à un type qui contient déjà un indexeur, car le compilateur définit automatiquement le membre par défaut pour les types avec des indexeurs (CS0646). Supprimez l’attribut
DefaultMember. - Tous les IndexerNameAttribute attributs d’un type doivent spécifier le même nom (CS0668). Modifiez les noms en correspondance, car le runtime utilise un nom unique pour tous les indexeurs d’un type.
- Le type spécifié comme argument pour TypeForwardedToAttribute doit être un type non générique, non imbriqué, non pointeur, non-array (CS0735). Seuls les types nommés de niveau supérieur sont des cibles de transfert valides.
- Un assembly ne peut avoir qu’un TypeForwardedToAttribute seul pour chaque type externe (CS0739). Recherchez et supprimez la déclaration dupliquée
TypeForwardedTo. - RequiredAttributeAttribute n'est pas autorisé sur les types définis en C# (CS1608). Cet attribut est réservé aux autres langages qui doivent forcer les compilateurs à exiger une fonctionnalité particulière.
- Certains attributs sont réservés au compilateur et ne peuvent pas être appliqués manuellement dans le code source (CS9331). Remplacez l’attribut par la syntaxe de langage C# équivalente pour que le compilateur le génère.
Utilisation des attributs conditionnels
Vous voyez les erreurs suivantes lorsque vous appliquez ConditionalAttribute d'une manière qui viole ses restrictions d'utilisation.
- CS0243 : L’attribut conditionnel n’est pas valide sur « method », car il s’agit d’une méthode de remplacement.
- CS0577 : L’attribut conditionnel n’est pas valide, car il s’agit d’un constructeur, d’un destructeur, d’un opérateur, d’une expression lambda ou d’une implémentation d’interface explicite.
- CS0578 : L’attribut conditionnel n’est pas valide sur « function », car son type de retour n’est pas void.
- CS0582 : L’attribut conditionnel n’est pas valide sur les membres de l’interface.
- CS0629 : Le membre conditionnel 'member' ne peut pas implémenter le membre de l’interface 'membre de classe de base' dans le type 'Type Name'.
- CS0685 : Le membre conditionnel 'member' ne peut pas avoir de paramètre out.
- CS1618 : Impossible de créer un délégué avec une méthode, car elle ou une méthode qu’elle substitue a un attribut conditionnel
- CS1689 : L’attribut n’est valide que sur les méthodes ou les classes d’attributs
Pour corriger ces erreurs, suivez ces règles. Pour plus d’informations, consultez ConditionalAttribute, Méthodes conditionnelles et Attributs.
- Le compilateur lie des appels à la déclaration de la méthode de base, et non à la surcharge. Vous ne pouvez donc pas appliquer l’attribut
Conditionalaux méthodes surcharge (CS0243). Supprimez l’attributConditionalde la méthode override ou supprimez leoverridemot clé. - L’attribut
Conditionaln’est pas valide sur les constructeurs, finaliseurs, opérateurs, expressions lambda ou implémentations d’interface explicites (CS0577). Ces types de membres ne peuvent pas être omis de manière conditionnelle, car ils ont des rôles requis dans le cycle de vie ou le contrat du type. - Les méthodes conditionnelles doivent retourner
void, car le compilateur peut omettre entièrement l’appel et aucune valeur de retour n’est disponible pour l’appelant (CS0578). Remplacez le type de retour de la méthode parvoid, ou supprimez l’attributConditional. - Les membres de l’interface ne peuvent pas être conditionnels, car tous les membres de l’interface doivent être implémentés (CS0582). Supprimez l’attribut
Conditionalde la déclaration de membre de l’interface. - Les méthodes qui implémentent des membres d’interface ne peuvent pas être conditionnelles, car le contrat d’interface exige qu’ils soient présents dans toutes les builds (CS0629). Supprimez l’attribut
Conditionalde la méthode d’implémentation. - Les méthodes conditionnelles ne peuvent pas avoir
outde paramètres, car la valeur de laoutvariable n’est pas définie lorsque le compilateur omet l’appel de méthode (CS0685). Supprimez lesoutparamètres de la méthode ou supprimez l’attributConditional. - Vous ne pouvez pas créer de délégué qui fait référence à une méthode conditionnelle, car la méthode n’existe peut-être pas dans les builds où le symbole de condition n’est pas défini (CS1618). Supprimez l’attribut
Conditionalde la méthode ou ne l’utilisez pas comme cible déléguée. - L’attribut
Conditionalest valide uniquement sur les méthodes et les classes d’attributs (CS1689). Il n’est pas valide sur d’autres types de déclaration tels que des classes non-attributs, des structs ou des interfaces.
Utilisation de l’attribut CallerArgumentExpression
Les erreurs suivantes se produisent lorsque vous appliquez CallerArgumentExpressionAttribute incorrectement ou en conflit avec d’autres attributs d’informations de l’appelant :
- CS8959 : CallerArgumentExpressionAttribute ne peut pas être appliqué, car il n’existe aucune conversion standard de type1 en type2
- CS8960 : CallerArgumentExpressionAttribute appliqué au paramètre n’aura aucun effet. Elle est remplacée par CallerLineNumberAttribute.
- CS8961 : CallerArgumentExpressionAttribute appliqué au paramètre n’aura aucun effet. Elle est remplacée par CallerFilePathAttribute.
- CS8962 : CallerArgumentExpressionAttribute appliqué au paramètre n’aura aucun effet. Elle est remplacée par CallerMemberNameAttribute.
- CS8963 : CallerArgumentExpressionAttribute appliqué au paramètre n’aura aucun effet. Elle est appliquée avec un nom de paramètre non valide.
Pour corriger ces erreurs, suivez ces règles. Pour plus d’informations, consultez attributs d’informations de l’appelant et CallerArgumentExpressionAttribute.
- Le paramètre décoré avec
CallerArgumentExpressiondoit avoir le typestringou être d’un type bénéficiant d'une conversion standard depuisstring, car l’attribut injecte unestringreprésentation de l’expression d’argument de l’appelant (CS8959). Remplacez le typestringde paramètre par ou par un type compatible. - L’attribut
CallerArgumentExpressionn’a aucun effet sur un paramètre qui a CallerLineNumberAttributeégalement , CallerFilePathAttributeou CallerMemberNameAttribute (CS8960, CS8961, CS8962). Ces attributs d’informations de l’appelant sont prioritaires. Supprimez donc l’attributCallerArgumentExpressiondu paramètre. - L’argument de chaîne transmis au
CallerArgumentExpressionconstructeur doit correspondre au nom d’un autre paramètre dans la même signature de méthode (CS8963). Si le nom du paramètre est mal orthographié ou fait référence à un paramètre inexistant, l’attribut n’a aucun effet.