コンパイラの警告 (レベル 1) CS1956

更新 : 2007 年 11 月

エラー メッセージ

メンバ 'name' は、インターフェイス メンバ 'name' を型 'type' で実装します。このインターフェイス メンバには、実行時に一致するメンバが複数存在します。どのメソッドが呼び出されるかは実装に依存します。

この警告は、2 つのインターフェイス メソッドが、特定のパラメータが ref であるか out であるかという点だけで異なっているときに生成されます。実行時に実際に呼び出されるのがどのメソッドか明らかではない、または保証されていないため、この警告を回避するにはコードを変更するのが最良の方法です。

C# では out と ref が区別されますが、CLR では同じものとして認識されます。どちらのメソッドがインターフェイスを実装するか決定するとき、CLR はどちらか 1 つを選択します。

この警告を回避するには

  • コンパイラに、メソッドを区別する方法を用意します。たとえば別々の名前を付けたり、片方にパラメータを追加したりします。

使用例

次のコードでは、Base の 2 つの Test メソッドは、最初のパラメータの ref/out 修飾子が異なるだけであるため、CS1956 が生成されます。

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