web-dev-qa-db-ja.com

アンダースコアの付いたこの名前がCLSに準拠していないのはなぜですか?

コンパイラの警告が表示されるのはなぜですか

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

次のコードの場合?

public abstract class DomainObjectBase
{
    protected bool _isNew;
}
54
MatthewMartin

共通言語仕様 から:

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

これを調べる

つまり、識別子の最初の文字は、大文字、小文字、タイトルケース文字、修飾子文字、その他の文字、または文字番号にすることができます。識別子の後続の文字は、任意の文字に加えて、非スペーシングマーク、スペーシングを組み合わせたスペーシング、10進数、コネクタの句読点、およびフォーマットコード(左右マークなど)です。通常、識別子を保存または比較する前に、フォーマットコードを除外する必要があります。

基本的に、アンダースコアで識別子を開始することはできません-これは、可視(パブリック/保護)フィールドでのCLS準拠に違反します。

80
Reed Copsey

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;
    
40
Martin Brown

先頭の アンダースコア に付随する_isNew表示されている(つまり、非公開)。

28
jason

アンダースコアが問題の原因です。一般的には、アンダースコアはプライベートフィールド用に予約されています。保護/公開メンバーは適切に大文字と小文字を区別し、名前を付けてください。

例えば:

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; }
}
7
NotMe

CLS準拠の識別子は、アンダースコアで始まってはなりません。

2
Lloyd

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

1
Tim Stewart

先頭の_は非CLS準拠です

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

1
Frozenskys

データメンバーの名前、_isNew、アンダースコアで始まります。

0
TcKs