Warnt CS3006 gültig in diesem Fall?
-
23-08-2019 - |
Frage
Der folgende Code erzeugt eine Warnung CS3006 "überladene Methode MyNamespace.Sample.MyMethod (int [])‘ unterscheidet sich nur in ref oder zu verkleinern, oder in Array rank, ist nicht CLS-konform".
Ist diese Warnung gültig, das heißt dann ist dies wirklich nicht CLS-kompatibel? Ich hätte eine explizite Schnittstellenimplementierung dachte nicht als Überlast zählen würde.
[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);
}
}
Lösung
CLS-Kompatibilität gilt nur für den sichtbaren Teil der Klasse. Daher würden Sie denken, dass der ref int[]
nicht public
und daher nicht relevant. Aber es ist sichtbar, über die Schnittstelle.
Der Anwender des Codes weiß, dass Sample
void MyMethod(int[])
zur Verfügung stellt. Sie wissen auch, dass es ISample
implementiert, die void MyMethod(ref int[])
bietet. Deshalb glaube ich, es ist in der Tat nicht CLS-konform.
EDIT: Eric Lippert hat sich auf die ursprüngliche Frage kommentierte, dass er glaubt, dies ist in der Tat ein Compiler-Fehler und dass der ursprüngliche Code ist CLS-konform.
Dies ist jedoch gilt:
[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);
}
}
Das ist, weil CLS definiert, dass zwei Schnittstelle widersprüchlichen Methoden mit dem gleichen Namen oder Unterschrift und der Compiler definieren muss wissen, wie man den Unterschied sagen -. Aber auch hier nur dann, wenn der Konflikt zwischen zwei Schnittstellen