Действительно ли предупреждение CS3006 в этом случае?

StackOverflow https://stackoverflow.com/questions/897249

  •  23-08-2019
  •  | 
  •  

Вопрос

Приведенный ниже код генерирует предупреждение CS3006 «Перегруженный метод MyNamespace.Sample.MyMethod(int[])», отличающийся только ссылкой или выходом, или рангом массива, не является 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);
    }
}
Это было полезно?

Решение

Соответствие 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 определяет, что два интерфейса могут определять конфликтующие методы с одинаковым именем или сигнатурой, и компилятор должен знать, как определить разницу - но опять же, только тогда, когда конфликт возникает между двумя интерфейсами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top