为什么这个名字带下划线不符合CLS?

为什么我得到编译器警告

标识符“Logic.DomainObjectBase._isNew”不符合CLS

为下面的代码?

public abstract class DomainObjectBase { protected bool _isNew; } 

从通用语言规范 :

符合CLS的语言编译器必须遵守Unicode标准3.0技术报告15附录7的规定,该标准pipe理可以启动并包含在标识符中的一组字符。 这个标准可以从Unicode联盟的网站上获得。

如果你看这个 :

也就是说,标识符的第一个字符可以是大写字母,小写字母,标题字母,修饰符,其他字母或字母编号。 标识符的后续字符可以是任何这些字符,加上非间距标记,间距组合标记,十进制数,连接符标点和格式化代码(例如右 – 左标记)。 通常格式化代码在存储或比较标识符之前应该被过滤掉。

基本上,你不能用一个下划线来启动一个标识符 – 这违反了一个可见的(public / protected)域的CLS。

CLS遵从性与不同的.NET语言之间的互操作性有关。 该属性不符合CLS,因为它以下划线开始并且是公共的(注意:公共类中的受保护属性可以从组件外部访问)。 虽然这将工作,如果从C#访问属性,它可能不会从其他.NET语言访问,不允许在属性名称的下划线下划线,因此它不符合CLS。

你得到这个编译器错误,因为在你的代码中的某个地方,你已经用一个类似这样的代码将你的程序集标记为符合CLS:

 [assembly: CLSCompliant(true)] 

Visual Studio在AssemblyInfo.cs文件中包含这一行,可以在大多数项目的属性下find它。

为了解决这个错误,你可以:

  1. 重命名你的财产(推荐):

     protected bool isNew; 
  2. 将整个程序集设置为不符合CLS:

     [assembly: CLSCompliant(false)] 
  3. 只为您的媒体资源添加属性:

     [CLSCompliant(false)] protected bool _isNew; 
  4. 改变属性的范围,以便在程序集外面看不到。

     private bool _isNew; 

_isNew同时可见的前导下划线 (即,不是私有的)。

下划线导致问题。 通常的做法是下划线是为私人领域保留的。 受保护的/公共的成员应该有适当的包装和命名。

例如:

 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; } } 

符合CLS的标识符不应以下划线开头。

这是下划线。 看到这篇文章 。

领先_是不符合CLS的

Microsoft StyleCop将分析您的代码,并提供相关文档的链接,解释为什么它不符合CLS。

由于数据成员_isNew的名称以下划线开头。