È l'avvertimento CS3006 valida in questo caso?
-
23-08-2019 - |
Domanda
Il codice di seguito genera un CS3006 avvertimento "overload metodo MyNamespace.Sample.MyMethod (int [])' differiscono solo per ref o fuori, o di grado array, non è compatibile con CLS".
E 'questo avviso valida, vale a dire è questo davvero non è compatibile con CLS? Avrei pensato un'implementazione dell'interfaccia esplicita non conterebbe come un sovraccarico.
[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);
}
}
Soluzione
la conformità CLS è valida solo per la parte visibile della tua classe. Pertanto, si potrebbe pensare che il ref int[]
non è public
e quindi non rilevante. Ma è visibile, attraverso l'interfaccia.
Gli utenti del codice sanno che Sample
fornisce void MyMethod(int[])
. Sanno anche che implementa ISample
che fornisce void MyMethod(ref int[])
. Pertanto, credo che in realtà non è compatibile con CLS.
EDIT: Eric Lippert ha commentato la domanda iniziale che egli crede che questo sia in realtà un bug del compilatore e che il codice originale è CLS-Compliant.
Questa, però, è valido:
[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);
}
}
Questo perché CLS definisce che due interfaccia può definire metodi in conflitto con lo stesso nome o la firma e il compilatore deve saper dire la differenza -. Ma ancora una volta, solo quando il conflitto è tra due interfacce