2009-05-22 46 views
3

以下代码生成警告CS3006“重载的方法MyNamespace.Sample.MyMethod(int [])'仅在ref或out或array rank中不同,不符合CLS”。在这种情况下警告CS3006有效吗?

此警告是否有效,即是否真的不符合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

这很有趣。我没有答案,但我会试着找出...... IMO,它不应该是一个错误。 – 2009-05-22 11:13:00

+0

顺便说一句,我已经在.NET 4.0中试过了,它的行为相同。 – 2009-05-22 11:20:32

回答

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定义了两种接口可以定义矛盾的方法具有相同的名称或签名,编译器必须知道如何分辨出来 - 但是只有在两个界面之间发生冲突时才会如此。