为什么这个名字带下划线不符合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它。
为了解决这个错误,你可以:
-
重命名你的财产(推荐):
protected bool isNew;
-
将整个程序集设置为不符合CLS:
[assembly: CLSCompliant(false)]
-
只为您的媒体资源添加属性:
[CLSCompliant(false)] protected bool _isNew;
-
改变属性的范围,以便在程序集外面看不到。
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
的名称以下划线开头。