コンパイラの警告 (レベル 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);
}
}