Kompilatorvarning (nivå 1) CS1956

Medlemmens namn implementerar gränssnittsmedlemmens namn i typen "typ". Det finns flera matchningar för gränssnittsmedlemmen vid körning. Det är implementeringsberoende vilken metod som ska anropas.

Den här varningen kan genereras när två gränssnittsmetoder endast särskiljs av om en viss parameter är markerad med ref eller med out. Det är bäst att ändra koden för att undvika den här varningen eftersom det inte är uppenbart eller garanterat vilken metod som anropas vid körning.

Även om C# skiljer mellan out och ref, ser CLR dem som samma. När du bestämmer vilken metod som implementerar gränssnittet väljer CLR bara en.

Så här undviker du den här varningen

  1. Ge kompilatorn ett sätt att särskilja metoderna. Du kan till exempel ge dem olika namn eller ange ytterligare en parameter på en av dem.

Exempel

Följande kod genererar CS1956 eftersom de två Test metoderna i Base endast ref/out skiljer sig från modifieraren för den första parametern.

// 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);  
    }  
}