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);
    }
}
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top