web-dev-qa-db-fra.com

L'appel est ambigu entre les méthodes ou propriétés suivantes

Supposons que j'ai ces deux ctors:

public SomeClass(string a, Color? c = null, Font d = null)
        {
            // ...
        }

public SomeClass(string a, Font c = null, Color? d = null)
        {
            // ...
        }

~ et je fais ceci:

SomeClass sc = new SomeClass("Lorem ipsum");

J'obtiendrai ceci: "Erreur 1 L'appel est ambigu entre les méthodes ou propriétés suivantes [...]"

Il me semble évident que peu importe celui que j'appelle le résultat final est le même (au moins dans ce cas particulier, et pour moi c'est tout ce qui compte en ce moment), alors quelles sont mes options pour me déplacer ce?

EDIT 1: @oltman: exemple simplifié.

Je veux juste pouvoir écrire

[...] new SomeClass("Lorem", Color.Green)

au lieu de

[...] new SomeClass("Lorem", null, Color.Green)
21
Agon Eous

Les deux constructeurs prennent le même nombre d'arguments, mais dans un ordre différent. Puisque vous avez spécifié des valeurs par défaut pour les deux paramètres du constructeur, le compilateur ne peut pas distinguer les deux surcharges lorsque le deuxième argument n'est pas fourni.

Je vous conseille de supprimer les constructeurs existants et de les remplacer par ce qui suit:

public SomeClass(string a, Color? color, Font font)
{
    // constructor implementation
}

public SomeClass(string a) : this(a, null, null) {}
public SomeClass(string a, Color color) : this(a, color, null) {}
public SomeClass(string a, Font font) : this(a, null, font) {}
30
Phil Klein

Une façon de le forcer à fonctionner:

SomeClass sc = new SomeClass("Lorem ipsum", (Color?)null, (Font)null);
9
RQDQ

Ceci est un parfait exemple de anti-pattern, la meilleure façon d'éviter cela est la réponse de @Phil Klein.

Voici une autre syntaxe pour passer la classe comme nulle:

SomeClass sc = new SomeClass("Lorem ipsum", null as Color, null as Font);
3
Shahar Shokrani

Pouvez-vous créer un autre constructeur qui ne prend que la chaîne et mettre à jour les constructeurs ci-dessus pour rendre leurs seconds paramètres obligatoires?

Si l'idée est que vous pouvez construire l'objet en fournissant toujours la chaîne et en fournissant éventuellement une couleur ou une police ou les deux, qu'en est-il de ceci:

public SomeClass(string a)
        {
            // ...
        }

public SomeClass(string a, Color? c)
        {
            // ...
        }

public SomeClass(string a, Font f, Color? d = null)
        {
            // ...
        }
1
nnnnnn

J'obtiendrai ceci: "Erreur 1 L'appel est ambigu entre les méthodes ou propriétés suivantes [...]"

Il me semble évident que peu importe lequel j'appelle le résultat final est le même

L'appel est ambigu. Chaque constructeur est unique - peu importe qu'il crée et renvoie une instance, car il pourrait y avoir une logique différente dans chaque constructeur. Le compilateur ne sait toujours pas de quel constructeur vous parlez.

0
matt