2009-05-22 81 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定義了兩種接口可以定義矛盾的方法具有相同的名稱或簽名,編譯器必須知道如何分辨出來 - 但是隻有在兩個界面之間發生衝突時纔會如此。