2009-07-28 340 views
52

爲什麼我得到了編譯器警告爲什麼帶有下劃線的名稱不符合CLS?

標識符 'Logic.DomainObjectBase._isNew' 是不符合CLS

以下的代碼?

public abstract class DomainObjectBase 
{ 
    protected bool _isNew; 
} 
+23

你可能不應該被標記爲非私人用下劃線成員反正。我知道每個人都有自己的風格,但其他人幾乎肯定會認爲這個領域是私人的,不符合常規。 – 2009-07-28 17:25:36

+0

@EdS。哪個公約? – Pharap 2015-06-16 02:16:52

+0

似乎一次是一個VB約定,它也似乎超出了C++,C#的風格,比在這裏找到的這個盒子更適合:https://stackoverflow.com/questions/3136594/naming-約定 - 下劃線在cc-變量 – MatthewMartin 2015-06-16 03:10:57

回答

77

Common Language Specification

符合CLS的語言編譯器必須遵循Unicode標準3.0的技術報告15,其支配的組可以就被列入標識字符的附件7規則。這個標準可以從Unicode聯盟的網站上獲得。

如果look this up

也就是說,標識符的第一個字符可以是大寫字母,小寫字母,首字母大寫字母,修飾符字母,其他字母,或字母數字。標識符的後續字符可以是任何這些字符,加上非間距標記,間距組合標記,十進制數,連接符標點和格式化代碼(例如右 - 左標記)。通常格式代碼在存儲或比較標識符之前應該被過濾掉。

基本上,您不能使用下劃線啓動標識符 - 這違反了可見(公共/受保護)字段上的CLS標準。

1

這是下劃線。看到這個article

0

由於數據成員的名稱_isNew開頭是下劃線。

2

符合CLS的標識符不應以下劃線開頭。

7

下劃線導致問題。通常的做法是下劃線是專用於私人領域的。受保護的/公共成員應該適當地加以套用和命名。

例如:

public abstract class DomainObjectBase{ 
    private bool _isNew; 
    protected bool IsNew { get { return _isNew; } set { _isNew = value;} } 
} 

,或者,如果你想使用3.x和擺脫私人領域:

public abstract class DomainObjectBase{ 
    protected bool IsNew { get; set; } 
} 
1

領先_是不符合CLS

Microsoft StyleCop將分析您的代碼,並提供指向相關文檔的鏈接,說明它不符合CLS的原因。

38

CLS compliance與不同的.NET語言之間的互操作性有關。該屬性不符合CLS,因爲它以下劃線開頭並且是公共的(注意:公共類中的受保護屬性可以從組件外部訪問)。雖然如果從C#訪問屬性,這將起作用,但如果從其他.NET語言訪問屬性名稱時不允許使用下劃線,則該屬性可能不適用,因此它不符合CLS。

您收到此編譯器錯誤,因爲地方在你的代碼已標記您的組件,CLS符合線路是這樣的:

[assembly: CLSCompliant(true)] 

Visual Studio中包含AssemblyInfo.cs文件中這行可以在大多數項目的屬性下找到。

要解決這個錯誤,您可以:

  1. 重命名你的財產(推薦):

    protected bool isNew; 
    
  2. 設置你的整個裝配爲不符合CLS:

    [assembly: CLSCompliant(false)] 
    
  3. 爲您的房產添加屬性:

    [CLSCompliant(false)] 
    protected bool _isNew; 
    
  4. 更改屬性的範圍,以使其不能在組件外部看到。

    private bool _isNew; 
    
相關問題