Pergunta

O código abaixo gera um CS3006 aviso "sobrecarregado método MyNamespace.Sample.MyMethod (int [])' diferindo apenas na ref ou para fora, ou no posto de matriz, não é compatível com CLS".

É este aviso válido, ou seja, é este realmente não compatível com CLS? Eu teria pensado que uma implementação de interface explícita não contaria como uma 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);
    }
}
Foi útil?

Solução

CLS conformidade só se aplica à parte visível da sua classe. Portanto, você acha que o ref int[] não é public e, portanto, não é relevante. Mas é visível, através da interface.

Os usuários de seu código sabe que Sample fornece void MyMethod(int[]). Eles também sabem que ele implementa ISample que fornece void MyMethod(ref int[]). Portanto, eu acredito que é, de facto, não compatível com CLS.


EDIT: Eric Lippert comentou sobre a pergunta original que ele acredita que este é na verdade, um erro compilador e que o código original é compatível com CLS.


Isso, no entanto, é 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);
    }
}

Isso é porque CLS define que duas interface pode definir conflitantes métodos com o mesmo nome ou assinatura e o compilador deve saber como dizer a diferença -. Mas, novamente, apenas quando o conflito é entre duas interfaces

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top