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
- 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);
}
}
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour