更新: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); } } |