Est un avertissement CS3006 valable dans ce cas?
-
23-08-2019 - |
Question
Le code ci-dessous génère un CS3006 d'avertissement « méthode surchargée de MyNamespace.Sample.MyMethod (int []) » qui ne diffèrent que dans la référence ou arrière, ou le rang de la matrice, est non conforme CLS ».
Est-ce avertissement valable, à savoir est-ce vraiment pas conforme CLS? Je l'aurais pensé une implémentation d'interface explicite ne compte pas comme une surcharge.
[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);
}
}
La solution
conformité CLS applique uniquement à la partie visible de votre classe. Par conséquent, vous penseriez que le ref int[]
ne public
et donc pas pertinent. Mais il est visible, à travers l'interface.
Les utilisateurs de votre code savent que Sample
fournit void MyMethod(int[])
. Ils savent aussi qu'il met en œuvre ISample
qui fournit void MyMethod(ref int[])
. Par conséquent, je crois qu'il est en fait pas conforme CLS.
EDIT: Eric Lippert a commenté la question initiale qu'il croit que c'est en fait un bug du compilateur et que le code d'origine est conforme CLS.
Ceci, cependant, est valide:
[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);
}
}
C'est parce que CLS définit que deux interface peut définir des méthodes contradictoires avec le même nom ou la signature et le compilateur doit savoir comment faire la différence -. Mais encore une fois, que lorsque le conflit est entre deux interfaces