55

コンパイラの警告が表示される理由

識別子 'Logic.DomainObjectBase._isNew' は CLS に準拠していません

次のコードは?

public abstract class DomainObjectBase
{
    protected bool _isNew;
}
4

8 に答える 8

80

共通言語仕様から:

CLS 準拠の言語コンパイラは、Unicode 標準 3.0 の Technical Report 15 の Annex 7 の規則に従う必要があります。この規則は、識別子を開始して識別子に含めることができる文字セットを管理します。この標準は、Unicode Consortium の Web サイトから入手できます。

これを調べると

つまり、識別子の最初の文字は、大文字、小文字、表題文字、修飾文字、その他の文字、または文字番号にすることができます。識別子の後続の文字は、それらの任意の文字に加えて、非間隔記号、間隔結合記号、10 進数、接続句読点、および書式設定コード (right-left-mark など) にすることができます。通常、フォーマット コードは、識別子を保存または比較する前に除外する必要があります。

基本的に、アンダースコアで識別子を開始することはできません。これは、可視 (パブリック/保護) フィールドでの 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

アンダースコアが問題の原因です。一般的な慣例として、アンダースコアはプライベート フィールド用に予約されています。protected / public メンバーは、適切に大文字と小文字を区別して名前を付ける必要があります。

例えば:

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

先頭の_はCLSに準拠していません

Microsoft StyleCopはコードを分析し、CLSに準拠していない理由を説明する関連ドキュメントへのリンクを提供します。

于 2009-07-28T15:57:58.770 に答える
1

それはアンダースコアです。この記事を参照してください。

于 2009-07-28T15:53:01.663 に答える
0

データ メンバの名前は、_isNewがアンダースコアで始まるためです。

于 2009-07-28T15:53:04.800 に答える