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