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);
    }
}
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top