Está alertando CS3006 válida neste caso?
-
23-08-2019 - |
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);
}
}
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