Compilerwarnung (Stufe 1) CS1956

Der Member 'Name' implementiert den Schnittstellenmember 'Name' im Typ 'Typ'.Zur Laufzeit gibt es mehrere Übereinstimmungen für den Schnittstellenmember.Die aufgerufene Methode ist implementierungsabhängig.

Diese Warnung wird generiert, wenn sich zwei Schnittstellenmethoden lediglich dadurch unterscheiden, dass ein bestimmter Parameter ref oder out entspricht. Es empfiehlt sich, den Code zu ändern, um diese Warnung zu vermeiden, da nicht eindeutig festgestellt bzw. gewährleistet werden kann, welche der Methoden zur Laufzeit tatsächlich aufgerufen wird.

Obwohl in C# zwischen out und ref unterschieden wird, werden sie von der CLR als identisch betrachtet. Bei der Entscheidung, von welcher Methode die Schnittstelle implementiert wird, wählt die CLR einfach eine Methode aus.

So vermeiden Sie diese Warnung

  • Geben Sie dem Compiler eine Möglichkeit, die Methoden zu unterscheiden. Beispielsweise können Sie ihnen unterschiedliche Namen zuweisen oder einen zusätzlichen Parameter für eine der Methoden bereitstellen.

Beispiel

Durch folgenden Code wird CS1956 generiert, da sich die beiden Test-Methoden in Base nur durch den ref/out-Modifizierer im ersten Parameter unterscheiden:

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