2012-10-31 10 views
73

をマークすることはできません私はこのようなPI定数を宣言しようとしています:定数は、静的

public static const double PI = Math.PI; 

が、なぜ私はこのエラーを取得していますか?

The constant 'Calendar.NewCalendar.PI' cannot be marked static 
+1

可能な複製http://stackoverflow.com/questions/408192/why-cant-i-have-public-static-const-string-s-stuff-in-my-class – himanshupareek66

答えて

156

conststaticを意味します(constの値を参照するインスタンスは必要ありません)。

また、この重要な点を追加したいと思います。public constのアセンブリにリンク(参照)する場合、その値はです。がアセンブリにコピーされています。したがって、参照されるアセンブリ内のconstの値が変更された場合でも、アセンブリには元々コンパイルされた値が残ります。

この動作がではなく、であれば、フィールドをpublic static readonlyフィールドにすることを検討する必要があります。

public class Foo { 
    public const int HATS = 42; 
    public static readonly int GLOVES = 33; 
} 

APP.EXE、参照Lib.dll:

Foo.HATS // This will always be 42 even if the value in Lib.dll changes, 
      // unless App.exe is recompiled. 

Foo.GLOVES // This will always be the same as Foo.GLOVES in Lib.dll 

MSDN

より:

バイナリとして提供

Lib.dll、

いつでも変更が必要な情報を表す定数を作成しないでください。たとえば、サービスの価格、製品のバージョン番号、または会社のブランド名を格納する定数フィールドを使用しないでください。これらの値は時間と共に変化する可能性があり、コンパイラが定数を伝播するため、ライブラリでコンパイルされた他のコードを再コンパイルして変更を確認する必要があります。 DotNetPerlsから

のDLL。 constフィールドまたは宣言を使用すると、C#コンパイラは実際にconst変数の値を直接ILコードに埋め込みます。したがって、本質的に別のエンティティとしてconstを消去します。

注意:constに依存するプログラムがconst値が変更された後に再コンパイルされていない場合は、[彼らは以前の値を使用し続けますので]を 、彼らが破損する可能性があります。

9

静的constは使用できません。とにかく "const"は暗黙の静的なので、constの代わりにreadonlyを試してみるか、単に "static"を削除してください。

10

定数は定義上静的です。

+0

これは 'final'に適用されます。また、Javaで –

+0

@ BasheerAL-MOMANI:いいえ、ファイナルはコンストラクタコールの後で変更することはできません。これ以上何もない。 –

+0

aha次に 'final'は 'read-only'のようです,,,,そうですか? –

4

定数は、実行時ではなくコンパイル中にコード内で置き換えることはできません。したがって、静的対インスタンスの定義は必要ありません。

2

すべての定数宣言は暗黙的に静的であり、C#仕様では静的修飾子の(冗長な)包含が禁止されています。読者が静的宣言されたものと、宣言されていないものの2つの定数を見なければならない混乱を避けるためであると信じています。しかし、選択肢があるデフォルトのものでもあるアクセス修飾子を重複して指定することは禁止されていません。たとえば、(具象的な)メソッドは、デフォルトであるにもかかわらず明示的にプライベートとしてマークすることができます。ルールは、選択肢がない場合(例えば、インターフェース内のメソッド宣言)、冗長修飾子は禁止されているように見える。選択肢がある場合は許可されます。

関連する問題