为什么这个名称带有下划线而不符合CLS?

Mat*_*tin 54 .net c# cls-compliant

为什么我会收到编译器警告

标识符'Logic.DomainObjectBase._isNew'不符合CLS

对于以下代码?

public abstract class DomainObjectBase
{
    protected bool _isNew;
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 80

公共语言规范:

符合CLS的语言编译器必须遵循Unicode标准3.0的技术报告15的附件7的规则,该规则管理可以开始并包含在标识符中的字符集.该标准可从Unicode Consortium的Web站点获得.

如果你看一下:

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

基本上,您无法使用下划线启动标识符 - 这违反了可见(公共/受保护)字段上的CLS兼容性.

  • @Kevin:以上代码段中的所有术语均指Unicode类别:"Letter,uppercase","Letter,lowercase","Letter,titlecase","Letter,modifier","Letter,other"和"Number,letter" ".罗马数字是"字母数字"的一个例子.见http://www.fileformat.info/info/unicode/category/Nl/list.htm (2认同)

Mar*_*own 40

CLS合规性与不同.NET语言之间的互操作性有关.该属性不符合CLS,因为它以下划线开头并且是公共的(注意:公共类中的受保护属性可以从程序集外部访问).虽然如果从C#访问该属性,这将有效,但如果从其他.NET语言访问属性名称的开头不允许使用下划线,则可能无法访问该属性,因此它不符合CLS.

您收到此编译器错误,因为您的代码中的某处已将程序集标记为符合CLS的行,如下所示:

[assembly: CLSCompliant(true)]
Run Code Online (Sandbox Code Playgroud)

Visual Studio在AssemblyInfo.cs文件中包含此行,该文件可在大多数项目的"属性"下找到.

要解决此错误,您可以:

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

    protected bool isNew;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将整个程序集设置为非CLS兼容:

    [assembly: CLSCompliant(false)]
    
    Run Code Online (Sandbox Code Playgroud)
  3. 仅向您的媒体资源添加一个属性:

    [CLSCompliant(false)]  
    protected bool _isNew;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 更改属性的范围,以便在程序集外部看不到它.

    private bool _isNew;
    
    Run Code Online (Sandbox Code Playgroud)

  • 我个人喜欢把所有领域都私有化.如果我需要增加范围,我会将其包装在Property Get/Set中. (3认同)

jas*_*son 28

领先的下划线伴随着_isNew可见(即非私人).

  • +1但是你需要包括这样一个事实,即该成员是*非私有*,它与前导下划线一起使该成员的名称不符合CLS. (12认同)

Not*_*tMe 7

下划线导致问题.通常的做法是下划线保留给私有字段.受保护/公共成员应妥善装箱和命名.

例如:

public abstract class DomainObjectBase{   
   private bool _isNew;
   protected bool IsNew { get { return _isNew; } set { _isNew = value;} }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果你想使用3.x并摆脱私人领域:

public abstract class DomainObjectBase{   
   protected bool IsNew { get; set; }
}
Run Code Online (Sandbox Code Playgroud)