Compilerwarnung (Stufe 1) CS1956Compiler Warning (level 1) CS1956

Der Member „name“ implementiert den Schnittstellenmember im Typ „type“.Member 'name' implements interface member 'name' in type 'type'. Es gibt mehrere Übereinstimmungen für die Schnittstellenmember zur Laufzeit.There are multiple matches for the interface member at run-time. Welche Methode aufgerufen wird, ist implementierungsabhängig festzulegen, .It is implementation dependent which method will be called.

Diese Warnung kann generiert werden, wenn sich zwei Schnittstellenmethoden lediglich dadurch unterscheiden, ob ein bestimmter Parameter mit ref oder out gekennzeichnet ist.This warning can be generated when two interface methods are differentiated only by whether a particular parameter is marked with ref or with out. Es empfiehlt sich, Ihren Code zu ändern, um diese Warnung zu vermeiden, da es nicht offensichtlich oder garantiert ist, welche Methode zur Laufzeit aufgerufen wird.It is best to change your code to avoid this warning because it is not obvious or guaranteed which method is called at runtime.

Obwohl C# zwischen out und ref unterscheidet, sieht die CLR sie als identisch an.Although C# distinguishes between out and ref, the CLR sees them as the same. Bei der Entscheidung, welche Methode die Schnittstelle implementiert, wählt die CLR einfach eine.When deciding which method implements the interface, the CLR just picks one.

So vermeiden Sie diese WarnungTo avoid this warning

  1. Geben Sie dem Compiler eine Möglichkeit, die Methoden zu unterscheiden.Give the compiler some way to differentiate the methods. Beispielsweise können Sie ihnen unterschiedliche Namen zuweisen oder einen zusätzlichen Parameter für eine der Methoden angeben.For example, you can give them different names or provide an additional parameter on one of them.

BeispielExample

Im folgende Code wird CS1956 generiert, da sich die zwei Test-Methoden in Base nur durch den Modifizierer ref/out auf dem ersten Parameter unterscheiden.The following code generates CS1956 because the two Test methods in Base differ only by the ref/out modifier on the first parameter.

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