Поделиться через


Предупреждение компилятора (уровень 1) CS1956

Обновлен: Ноябрь 2007

Сообщение об ошибке

Член "имя" реализует интерфейсный член "имя" в типе "тип". Во время выполнения возникает множественное соответствие интерфейсных членов. Реализация зависит от того, какой метод будет вызван.
Member 'name' implements interface member 'name' in type 'type'. There are multiple matches for the interface member at run-time. It is implementation dependent which method will be called.

Данное предупреждение создается, если два метода интерфейса отличаются только типом одного определенного параметра: ref или out. Рекомендуется изменить код таким образом, чтобы предотвратить появление этого предупреждения, поскольку нельзя очевидным способом определить, какой из методов будет вызван во время выполнения.

Язык C# различает параметры с модификаторами "out" и "ref", однако в среде CLR они считаются одинаковыми. При вызове метода, реализующего интерфейс, среда CLR делает случайный выбор.

Устранение этого предупреждения

  • Предоставьте компилятору способ различения методов. Например, задайте им разные имена или предоставьте одному из них дополнительный параметр.

Пример

В следующем коде создается предупреждение CS1956, поскольку два метода Test класса Base отличаются только модификаторами 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);
    }
}