为什么我会收到编译器警告
标识符'Logic.DomainObjectBase._isNew'不符合CLS
以下代码?
public abstract class DomainObjectBase
{
protected bool _isNew;
}
答案 0 :(得分:80)
来自Common Language Specification:
符合CLS的语言编译器必须遵循Unicode标准3.0的技术报告15的附件7的规则,该规则管理可以开始并包含在标识符中的字符集。该标准可从Unicode Consortium的Web站点获得。
如果你look this up:
即,标识符的第一个字符可以是大写字母,小写字母,标题字母,修饰符,其他字母或字母编号。标识符的后续字符可以是其中任何一个,加上非间距标记,间距组合标记,十进制数,连接符标点符号和格式化代码(例如右 - 左标记)。通常,在存储或比较标识符之前,应过滤掉格式代码。
基本上,您无法使用下划线启动标识符 - 这会在可见(公共/受保护)字段上违反CLS。
答案 1 :(得分:39)
CLS compliance与不同.NET语言之间的互操作性有关。该属性不符合CLS,因为它以下划线开头并且是公共的(注意:公共类中的受保护属性可以从程序集外部访问)。虽然如果从C#访问该属性,这将有效,但如果从其他.NET语言访问属性名称的开头不允许使用下划线,则可能无法访问该属性,因此它不符合CLS。
您收到此编译器错误,因为您的代码中某处已将程序集标记为CLS,并且符合以下行:
[assembly: CLSCompliant(true)]
Visual Studio在AssemblyInfo.cs文件中包含此行,该文件可在大多数项目的“属性”下找到。
要解决此错误,您可以:
重命名您的财产(推荐):
protected bool isNew;
将整个程序集设置为非CLS兼容:
[assembly: CLSCompliant(false)]
仅向您的媒体资源添加一个属性:
[CLSCompliant(false)]
protected bool _isNew;
更改属性的范围,以便在程序集外部看不到它。
private bool _isNew;
答案 2 :(得分:28)
与_isNew
相关的前导underscore可见(即非私人)。
答案 3 :(得分: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; }
}
答案 4 :(得分:2)
符合CLS的标识符不应以下划线开头。
答案 5 :(得分:1)
这是下划线。请参阅此article。
答案 6 :(得分:1)
领先_符合非CLS
Microsoft StyleCop将分析您的代码,并提供相关文档的链接,说明其不符合CLS的原因。
答案 7 :(得分:0)
因为数据成员的名称_isNew
,所以以下划线开头。