100

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

public static const double PI = Math.PI;

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

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

5 に答える 5

205

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]破損する可能性があります。

于 2012-10-31T02:23:11.167 に答える
15

定数は定義上静的です。

于 2012-10-31T02:18:06.153 に答える
9

静的定数を持つことはできません。とにかく「const」は静的であることが暗示されているため、constの代わりに読み取り専用を試すか、単に「static」を削除してください。

于 2012-10-31T02:17:50.717 に答える
4

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

于 2012-10-31T02:19:33.703 に答える
3

すべての定数宣言は暗黙的に静的であり、C#仕様では、静的修飾子を(冗長に)含めることは禁止されています。これは、読者が静的と宣言された定数とそうでない定数の2つの定数を見た場合に発生する可能性のある混乱を回避するためだと思います。仕様の違いは、セマンティクスの違いを意味すると簡単に推測できます。そうは言っても、オプションがある場合、デフォルトのアクセス修飾子でもあるアクセス修飾子を冗長に指定することは禁止されていません。たとえば、(具体的な)メソッドは、デフォルトであるにもかかわらず、明示的にプライベートとしてマークすることができます。ルールは、選択の余地がない場合(たとえば、インターフェースでのメソッド宣言)、冗長な修飾子は禁止されているようです。選択肢がある場合は許可されます。

于 2017-08-25T08:00:11.943 に答える