更新:2007 年 11 月

错误消息

成员“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);
    }
}