Advertencia del compilador (nivel 1) CS1956

Actualización: noviembre 2007

Mensaje de error

El miembro 'nombre' implementa el miembro de interfaz 'nombre' en el tipo 'tipo'. El miembro de interfaz presenta varias coincidencias en tiempo de ejecución. El método que recibirá la llamada depende de la implementación.
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.

Esta advertencia se genera cuando dos métodos de interfaz sólo se diferencian en si un parámetro determinado es ref o out. Es mejor que cambie el código para evitar esta advertencia, ya que no es obvio ni está garantizado cuál de los métodos recibirá realmente la llamada en tiempo de ejecución.

Aunque C# distingue entre out y ref, Common Language Runtime (CLR) los ve de la misma forma. En el momento de decidir qué método implementa la interfaz, CLR simplemente elige uno.

Para evitar esta advertencia

  • Proporcione al compilador alguna manera de diferenciar los métodos. Por ejemplo, puede darles nombres diferentes o proporcionar un parámetro adicional en uno de ellos.

Ejemplo

El código siguiente genera la advertencia CS1956 porque los dos métodos Test en Base sólo difieren en el modificador ref/out de su primer 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);
    }
}