55

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

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

对于以下代码?

public abstract class DomainObjectBase
{
    protected bool _isNew;
}
4

8 回答 8

80

来自通用语言规范

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

如果你查一下

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

基本上,您不能使用下划线开始标识符 - 这违反了在可见(公共/受保护)字段上的 CLS 兼容。

于 2009-07-28T15:55:45.560 回答
43

CLS 合规性与不同.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;
    
于 2009-07-28T17:07:40.117 回答
28

与可见(即非私有)相伴的前导下划线。_isNew

于 2009-07-28T15:52:33.553 回答
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; }
}
于 2009-07-28T15:56:34.747 回答
2

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

于 2009-07-28T15:56:23.080 回答
1

是下划线。见这篇文章

于 2009-07-28T15:53:01.663 回答
1

前导 _ 不符合 CLS

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

于 2009-07-28T15:57:58.770 回答
0

因为数据成员的名称 ,_isNew以下划线开头。

于 2009-07-28T15:53:04.800 回答