🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Compiler Warning (level 1) CS1956 成员“name”实现类型“type”中的接口成员“name”。在运行时有多个与该接口成员相匹配的项。将调用哪个方法取决于具体的实现。 如果两个接口方法的唯一区别在于:某个特定参数被**ref** 还是 **out**标记,则将生成此警告。最好更改代码以避免此警告,因为在运行时实际将调用哪个方法并不十分明显,或者无法保证在运行时将调用哪个方法。 尽管 C# 可以区分 **out** 和**ref**,CLR 却无法区分它们。决定实现接口的方法时,CLR 只是从中任选一个。 ## 避免此警告 1. 为编译器提供某种方式来区分这两个方法。例如,可以为这两个方法提供不同的名称,或者为其中一个方法提供附加参数。 下面的代码将生成 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); } } ```