Partage via


Résolvez les erreurs et avertissements qui affectent la résolution de surcharge.

Cet article traite des erreurs suivantes du compilateur :

  • CS0034 - Opérateur ambigu sur les opérandes de type « type1 » et « type2 »
  • CS0035 - Opérateur ambigu sur un opérande de type « type »
  • CS0111 - Le type définit déjà un membre appelé « name » avec les mêmes types de paramètres
  • CS0121 - L’appel est ambigu entre les méthodes ou propriétés suivantes
  • CS0457 - Conversions définies par l’utilisateur ambiguës lors de la conversion de « type1 » en « type2 »
  • CS0663 - Impossible de définir des méthodes surchargées qui diffèrent uniquement sur ref et out.
  • CS1007 - L’accesseur de propriété est déjà défini
  • CS1019 - Opérateur unaire surchargeable attendu
  • CS1020 - Opérateur binaire surchargeable attendu
  • CS1501 - Aucune surcharge pour la méthode « method » ne prend « number » arguments
  • CS1534 - L’opérateur binaire surchargé « operator » prend deux paramètres
  • CS1535 - L’opérateur unaire surchargé « operator » prend un paramètre
  • CS1928 - « Type » ne contient pas de définition pour « method » et la meilleure surcharge de méthode d’extension « method » a des arguments invalides.
  • CS1929 - « TypeA » ne contient pas de définition pour « method » et la meilleure surcharge de méthode d’extension « TypeB.method » nécessite un récepteur de type « TypeC »
  • CS8315 - Opérateur ambigu sur les opérandes
  • CS9261 - Impossible d’utiliser « OverloadResolutionPriorityAttribute »sur un membre qui remplace un autre.
  • CS9262 - Impossible d’utiliser « OverloadResolutionPriorityAttribute »sur ce membre.

De plus, l’avertissement du compilateur suivant :

  • CS3006 - La méthode surchargée « method » différant uniquement par ref ou out, ou par le rang des tableaux, n’est pas conforme à la norme CLS.

Définition incorrecte de surcharge

  • CS0663 - Impossible de définir des méthodes surchargées qui diffèrent uniquement sur ref et out.
  • CS1019 - Opérateur unaire surchargeable attendu
  • CS1020 - Opérateur binaire surchargeable attendu
  • CS1534 - L’opérateur binaire surchargé « operator » prend deux paramètres
  • CS1535 - L’opérateur unaire surchargé « operator » prend un paramètre

De plus, l’avertissement du compilateur suivant :

  • CS3006 - La méthode surchargée « method » différant uniquement par ref ou out, ou par le rang des tableaux, n’est pas conforme à la norme CLS.

Lorsque vous créez des opérateurs surchargés dans votre classe, la signature doit correspondre au nombre de paramètres requis pour cet opérateur. Vous avez un nombre incorrect de paramètres dans la définition de l’opérateur.

De plus, les opérateurs surchargés doivent utiliser le nom d’opérateur défini. La seule exception est lorsque vous créez un opérateur de conversion, où le nom de l’opérateur correspond au type de retour de la conversion.

Surcharges en double définies

  • CS0111 - Le type définit déjà un membre appelé « name » avec les mêmes types de paramètres
  • CS1007 - L’accesseur de propriété est déjà défini

Ces erreurs indiquent que vous avez créé des surcharges qui ne sont pas différentes. Les plus courantes sont les suivantes :

  • Les types de paramètres correspondants ont une conversion d’identité. Par exemple M(dynamic) et M(object), ou M2(string) et M2(string?).
  • Les types de paramètres correspondants ne diffèrent que par le modificateur de référence. Par exemple : M(ref int) et M(out int).
  • Vous avez inclus à la fois un init et un set accesseur pour une propriété.

Aucune surcharge trouvée

  • CS1501 - Aucune surcharge pour la méthode « method » ne prend « number » arguments
  • CS1928 - « Type » ne contient pas de définition pour « method » et la meilleure surcharge de méthode d’extension « method » a des arguments invalides.
  • CS1929 - « TypeA » ne contient pas de définition pour ’method’ et la meilleure surcharge de méthode d’extension « TypeB.method » nécessite un récepteur de type « TypeC »

Votre code appelle une méthode où le nom existe, mais certains arguments sont incorrects, ou vous avez utilisé un nombre incorrect d’arguments. Si vous essayez d’appeler une méthode d’extension, la classe contenant la méthode pourrait être dans un espace de noms qui n’est pas importé.

Remarque

L’erreur CS1928 n’est pas utilisée par les compilateurs les plus récents. Les nouveaux compilateurs utilisent exclusivement CS1929.

Surcharges ambiguës

  • CS0034 - Opérateur ambigu sur les opérandes de type « type1 » et « type2 »
  • CS0035 - Opérateur ambigu sur un opérande de type « type »
  • CS0121 - L’appel est ambigu entre les méthodes ou propriétés suivantes
  • CS0457 - Conversions définies par l’utilisateur ambiguës lors de la conversion de « type1 » en « type2 »
  • CS8315 - Opérateur ambigu sur les opérandes

Ces erreurs indiquent qu’aucune surcharge n’est meilleure que les autres. Il existe plusieurs causes possibles à ces erreurs :

  • Différents arguments sont meilleurs pour chaque paramètre. L’un pourrait être une correspondance exacte et l’autre nécessiter une conversion :

      void M(int a, double b) {    }
      void M(double a, int b) {}
    
      M(1, 1); // ambiguous
    
  • Plusieurs opérateurs de conversion définis par l’utilisateur sont candidats. Les opérateurs de conversion peuvent être déclarés dans le type source, ses types de base, le type de destination ou ses types de base. Si un opérateur de conversion a été défini dans plus d’un endroit, le compilateur ne peut pas choisir.

  • Plusieurs opérateurs de conversion pourraient effectuer une conversion compatible.

  • Un ou plusieurs arguments utilisent default (pas default(T)) et plusieurs types pourraient être choisis.

Dans la plupart de ces cas, l’ajout d’un cast explicite peut spécifier quelle surcharge doit être choisie.

Priorité de résolution de surcharge

  • CS9261 - Impossible d’utiliser « OverloadResolutionPriorityAttribute » sur un membre qui remplace un autre.
  • CS9262 - Impossible d’utiliser « OverloadResolutionPriorityAttribute » sur ce membre.

Votre code a violé les règles d’utilisation du OverloadResolutionPriorityAttribute pour favoriser une surcharge plutôt qu’une autre. Vous ne pouvez pas appliquer le OverloadResolutionPriorityAttribute aux types de méthodes suivants :

  • Propriétés non indexées
  • Accesseurs de propriété, indexeur ou événement
  • Opérateurs de conversion
  • Lambdas
  • Fonctions locales
  • Finaliseurs
  • Constructeurs statiques

De plus, vous ne pouvez pas appliquer le OverloadResolutionPriorityAttribute à un override d’un membre virtual ou abstract. Le compilateur utilise la valeur de la déclaration du type de base.