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