Compiler Warning (level 1) CS1956
成员“name”实现类型“type”中的接口成员“name”。在运行时有多个与该接口成员相匹配的项。将调用哪个方法取决于具体的实现。
如果两个接口方法的唯一区别在于:某个特定参数被ref 还是 out标记,则将生成此警告。最好更改代码以避免此警告,因为在运行时实际将调用哪个方法并不十分明显,或者无法保证在运行时将调用哪个方法。
尽管 C# 可以区分 out 和ref,CLR 却无法区分它们。决定实现接口的方法时,CLR 只是从中任选一个。
避免此警告
- 为编译器提供某种方式来区分这两个方法。例如,可以为这两个方法提供不同的名称,或者为其中一个方法提供附加参数。
下面的代码将生成 CS1956,因为 Base 中这两个 Test 方法的唯一区别在于它们的第一个参数上的 ref/out 修饰符:
// 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);
}
}