Является ли предупреждение CS3006 действительным в этом случае? - PullRequest
3 голосов
/ 22 мая 2009

Приведенный ниже код генерирует предупреждение CS3006 «Перегруженный метод MyNamespace.Sample.MyMethod (int [])», отличающийся только ref или out или ранжированием массива, не соответствует CLS ».

Является ли это предупреждение действительным, т. Е. Действительно ли оно не соответствует CLS? Я бы подумал, что явная реализация интерфейса не будет считаться перегрузкой.

[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);
    }
}

1 Ответ

2 голосов
/ 22 мая 2009

Соответствие CLS относится только к видимой части вашего класса. Следовательно, вы думаете, что ref int[] не public и, следовательно, не имеет значения. Но это видно, через интерфейс.

Пользователи вашего кода знают, что Sample обеспечивает void MyMethod(int[]). Они также знают, что он реализует ISample, что обеспечивает void MyMethod(ref int[]). Поэтому я считаю, что это на самом деле не соответствует CLS.


РЕДАКТИРОВАТЬ: Эрик Липперт прокомментировал первоначальный вопрос, что он считает, что это на самом деле ошибка компилятора и что оригинальный код является CLS-совместимым.


Это, однако, действительно:

[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);
    }
}

Это связано с тем, что CLS определяет, что два интерфейса могут определять конфликтующие методы с одинаковыми именами или сигнатурами, и компилятор должен знать, как определить разницу, но опять же, только когда конфликт существует между двумя интерфейсами.

...