Partager via


Avertissement du compilateur (niveau 1) CS1956

Mise à jour : novembre 2007

Message d'erreur

Le membre 'nom de type' implémente le membre d'interface 'nom' dans le type 'type'. Il existe plusieurs correspondances pour le membre d'interface au moment de l'exécution. La méthode appelée dépend de l'implémentation.
Member 'name' implements interface member 'name' in type 'type'. There are multiple matches for the interface member at run-time. It is implementation dependent which method will be called.

Cet avertissement est généré lorsque deux méthodes d'interface sont différenciées uniquement par la valeur d'un paramètre particulier : ref ou out. Il est préférable de modifier votre code afin d'éviter cet avertissement, car vous ne pouvez pas être certain des méthodes qui seront effectivement appelées au moment de l'exécution.

Bien que C# fasse la différence entre out et ref, le CLR ne les distingue pas. Lorsqu'une méthode doit être déterminée pour implémenter l'interface, le CLR en choisit donc une au hasard.

Pour éviter cet avertissement

  • Fournissez au compilateur une façon de différencier les méthodes. Par exemple, vous pouvez attribuer aux méthodes des noms différents ou fournir à l'une d'elles un paramètre supplémentaire.

Exemple

Le code suivant génère CS1956 car les deux méthodes Test dans Base diffèrent uniquement par le modificateur ref/out sur leur premier paramètre :

// cs1956.cs
class Base<T, S>
{
    // This is the method that should be called.
    public virtual int Test(out T x) // CS1956
    {
        x = default(T);
        return 0;
    }

    // This is the "last" method and is the one that ends up being called
    public virtual int Test(ref S x)
    {
        return 1;
    }
}

interface IFace
{
    int Test(out int x);
}

class Derived : Base<int, int>, IFace
{
    static int Main()
    {
        IFace x = new Derived();
        int y;
        return x.Test(out y);
    }
}