在这种情况下警告CS3006有效吗?

下面的代码生成警告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); } } 

CLS合规性仅适用于您class级的可见部分。 因此,您认为ref int[]public ,因此不相关。 但它通过界面可见。

代码的用户知道Sample提供了void MyMethod(int[]) 。 他们也知道它实现了提供void MyMethod(ref int[]) ISample 。 因此,我认为它实际上不符合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定义了两个接口可以定义具有相同名称或签名的冲突方法,并且编译器必须知道如何区分 – 但同样,只有当冲突在两个接口之间时。