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);
    }
}
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top