下面的代码生成警告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);
}
}
答案 0 :(得分:2)
CLS合规性仅适用于班级的可见部分。因此,您认为ref int[]
不是public
,因此无关紧要。但它通过界面可见。
您的代码的用户知道Sample
提供void MyMethod(int[])
。他们也知道它实现ISample
提供void MyMethod(ref int[])
。因此,我认为它实际上不符合CLS。
编辑:Eric Lippert评论了原始问题,他认为这实际上是一个编译器错误,原始代码是符合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定义了两个接口可以定义具有相同名称或签名的冲突方法,并且编译器必须知道如何区分 - 但同样,只有当冲突在两个接口之间时才会发生。