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