定数は静的としてマークできません


96

私はこのようなPI定数を宣言しようとしています:

public static const double PI = Math.PI;

しかし、なぜこのエラーが発生するのですか?

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

回答:


197

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

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

この動作が許容できない場合は、フィールドをフィールドにすることを検討する必要がありpublic static readonlyます。

バイナリとして提供されるLib.dll:

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から:

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

DotNetPerlsから:

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

注意:aに依存するプログラムが値の変更const後に再コンパイルされないconst場合、[ 以前の値を引き続き使用するため ] 壊れる可能性があります


15

定数は、定義により静的です。


これはJavaの「ファイナル」にも適用されますか
Basheer AL-MOMANI '25年

@ BasheerAL-MOMANI:いいえ。ファイナルはコンストラクタの呼び出し後は変更できません。これ以上何もない。
juergen d 2016

9

静的constは使用できません。constの代わりにreadonlyを試すか、単に「静的」を削除してください。


4

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


3

すべての定数宣言は暗黙的に静的であり、C#仕様では、静的修飾子の(冗長な)組み込みは禁止されていると規定されています。これは、読者が静的と宣言されていない2つの定数を参照した場合に発生する可能性がある混乱を避けるためだと思います。とは言っても、選択肢があるデフォルトのアクセス修飾子を重複して指定することは禁止されていません。たとえば、(コンクリート)メソッドは、デフォルトであっても明示的にプライベートとしてマークできます。ルールは、選択肢がない場合(インターフェースでのメソッド宣言など)、冗長修飾子は禁止されているように見えます。選択肢がある場合は許可されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.