Avertissement du compilateur (niveau 1) CS1956

Le membre 'nom' 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.

Cet avertissement peut être généré quand deux méthodes d’interface sont différenciées uniquement par le fait qu’un paramètre particulier est marqué avec ref ou out. Il est préférable de modifier votre code pour éviter cet avertissement, car il n’y a aucun moyen de savoir avec certitude laquelle des deux méthodes sera appelée au moment de l’exécution.

Même si C# fait la distinction entre out et ref, le CLR les considère comme identiques. Quand il doit décider quelle méthode implémente l’interface, le CLR en choisit simplement une.

Pour éviter cet avertissement

  1. Fournissez au compilateur un moyen de différencier les méthodes. Par exemple, vous pouvez leur donner des noms différents ou fournir un paramètre supplémentaire sur l’une d’elles.

Exemple

Le code suivant génère l’avertissement CS1956 car les deux méthodes Test dans Base diffèrent uniquement par le modificateur ref/out sur le 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);  
    }  
}