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

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

对于以下代码?

public abstract class DomainObjectBase
{
    protected bool _isNew;
}
有帮助吗?

解决方案

公共语言规范

  

符合CLS语言编译器必须遵循Unicode标准3.0的技术报告15,其支配组可以就被包括在标识符的字符的附件7的规则。该标准可从Unicode协会的网站。

如果您看这件事

  

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

基本上,可以不启动以下划线的标识符 - 这违反CLS上的可见(公共/受保护的)字段兼容

其他提示

CLS 合规性 与不同系统之间的互操作性有关 。网 语言。该属性不符合 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;
    

前导下划线,提供_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兼容

了StyleCop 会分析你的代码,并提供链接到培训相关文件解释为何不符合CLS。

由于该数据成员的名称,_isNew,开始的用下划线

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top