Pregunta

El código siguiente genera un CS3006 de advertencia "sobrecargado método MyNamespace.Sample.MyMethod (int [])' que sólo difieren en la ref o hacia fuera, o en el rango de matriz, no es compatible con CLS".

¿Es esta advertencia válida, es decir, es esto realmente no compatible con CLS? Yo habría pensado una implementación de interfaz explícita no contaría como una sobrecarga.

[assembly: CLSCompliant(true)]
namespace MyNamespace
{

    public class Sample : ISample
    {
        public void MyMethod(int[] array)
        {
            return;
        }

        void ISample.MyMethod(ref int[] array)
        {
            this.MyMethod(array);
        }
    }

    public interface ISample
    {
        void MyMethod([In] ref int[] array);
    }
}
¿Fue útil?

Solución

compatibilidad con CLS sólo se aplica a la parte visible de su clase. Por lo tanto, se podría pensar que el ref int[] no se public y por lo tanto no es relevante. Pero es visible, a través de la interfaz.

Los usuarios de su código saben que Sample ofrece void MyMethod(int[]). También saben que implementa ISample que proporciona void MyMethod(ref int[]). Por lo tanto, creo que de hecho no es compatible con CLS.


EDIT: Eric Lippert ha comentado en la pregunta original que él cree que esto es de hecho, un error del compilador y que el código original es compatible con CLS.


Sin embargo, esto es válido:

[assembly: CLSCompliant(true)]
namespace MyNamespace
{
    public class Sample : ISample, ISample2
    {
        void ISample.MyMethod(ref int[] array)
        {
        }

        void ISample2.MyMethod(int[] array)
        {
        }
    }

    public interface ISample
    {
        void MyMethod(ref int[] array);
    }

    public interface ISample2
    {
        void MyMethod(int[] array);
    }
}

Esto se debe a que dos CLS define interfaz puede definir métodos en conflicto con el mismo nombre o firma y el compilador debe saber cómo decir la diferencia -. Pero de nuevo, sólo cuando el conflicto es entre dos interfaces

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top