aviso do compilador CS1956 (nível 1)

Mensagem de erro

Membro 'nome' implementa membro de interface 'nome' no tipo 'tipo'.Há várias correspondências para o membro de interface em time de execução.É dependente de implementação que método será chamado.

Esse aviso é gerado quando dois métodos de interface são diferenciados somente pelo se um determinado parâmetro é ref ou out. Ele é melhor alterar seu código para evitar este aviso porque não é óbvio ou garantida qual dos métodos, na verdade, ser chamado em tempo de execução.

Embora translation from VPE for Csharp distingue entre out e ref, o CLR vê-los sistema autônomo o mesmo.Ao decidir qual método implementa a interface, o CLR simplesmente seleciona um.

Para evitar este aviso

  • O compilador oferecem algumas maneira de diferenciar os métodos.Por exemplo, você pode dar-lhes nomes diferentes ou fornecer um parâmetro adicional em um deles.

Exemplo

O código a seguir gera CS1956 porque os dois Test métodos em Base diferem somente pela ref/out modificador em seu primeiro parâmetro:

// 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);
    }
}