2015-10-13 46 views
3

我在AC#類庫下面的代碼...使用枚舉是不符合CLS

public static class foo 
{ 
    public enum bar 
    { 
     bsNone = -1, 
     bsSolid = 0, 
     bsDash = 1 
    } 
} 

而且在VB.Net WinForms應用程序我引用枚舉的屬性的返回類型:

Private _LeftBorderStyle As foo.bar 
Public Property LeftBorderStyle() As foo.bar 
    Get 
     Return _LeftBorderStyle 
    End Get 
    Set(ByVal value As foo.bar)    
     _LeftBorderStyle = value 
    End Set 
End Property 

當我建立VB.Net項目我得到以下警告:

Return type of function 'LeftBorderStyle' is not CLS-compliant. 

你能告訴我爲什麼枚舉是不符合CLS的?

+0

是否將類庫標記爲符合CLS?如果沒有,你會得到這個警告。 –

+0

[參數類型不符合CLS,爲什麼?](http://stackoverflow.com/questions/3475726/argument-type-is-not-cls-compliant-why) – Backs

+0

不,但我不明白爲什麼類中的其他4000行代碼不是給我CLS合規警告?只有枚舉? –

回答

2

發生這種情況是因爲您公開從標記爲符合CLS的程序集中公開的程序集中,該程序集來自不符合CLS的程序集。

請注意,您允許消費 CLS兼容組件中不符合CLS的類型;但你不能暴露這種類型。

例如,假設你有這個類在非符合CLS裝配:

namespace NonCLSCompliantAssembly 
{ 
    public class Class1 
    { 
     public enum MyEnum 
     { 
      Red, 
      Green, 
      Blue 
     } 
    } 
} 

現在假設你有一個符合CLS的組件下面的類引用不符合CLS裝配:

namespace CLSCompliantAssembly 
{ 
    public class Class1 
    { 
     // This does NOT give a warning. 

     public int MyTest1() 
     { 
      return (int) NonCLSCompliantAssembly.Class1.MyEnum.Red; 
     } 

     // This DOES give a warning. 

     public NonCLSCompliantAssembly.Class1.MyEnum MyTest2() 
     { 
      return NonCLSCompliantAssembly.Class1.MyEnum.Red; 
     } 
    } 
} 

編譯器將警告你從非兼容組件繞MyTest1()'s使用類型MyEnum的,因爲它僅被內部使用。

但它警告您將其公開爲MyTest2()的公共返回類型。

如果通過將[assembly: CLSCompliant(true)]添加到AssemblyInfo.cs而使非CLS兼容組件符合要求,則代碼將全部編譯而不會發出警告。

要重申:如果您使用在不符合規範的程序集中定義的類型,那麼該類型自動不符合規範,即使它只是像枚舉一樣基本的東西。

Microsoft documentation for CLSCompliantAttribute

如果沒有CLSCompliantAttribute應用於程序單元,然後通過默認:

  • 的組件是不符合CLS。

  • 只有在封閉類型或裝配符合CLS的情況下,該類型才符合CLS。

  • 只有當類型符合CLS時,該類型的成員才符合CLS。

+2

雖然爲什麼enum不符合規範? – Rob

+0

@Rob它不符合規範,因爲它在不符合的程序集中定義。我在回覆的第一句話中說過......;) –

+0

感謝@Matthew,問題是編譯器爲什麼只抱怨非順從程序集中的枚舉,而不是其中的其他幾千個類呢?這是編譯器鎖定到它可以發現抱怨的最近的東西? –