10

今日、私はコンストラクターでデフォルトのパラメーター値を作成していました。

public SomeClass (String something = String.Empty)
{
   // ...
}

コンパイラが文句を言った。

「something」のデフォルトのパラメータ値は、コンパイル時定数でなければなりません。

StringクラスのEmptyはコンパイル時定数であるという印象を受けました。

.field public static initonly string Empty

コンパイル時定数の意味を誤解しているのでしょうか、それとも受け入れる必要があるのはもっと奇抜なことでしょうか。

4

3 に答える 3

4

このSOの質問に対する受け入れられた答えなぜString.Emptyは定数ではないのですか?は:

constの代わりに静的読み取り専用が使用される理由は、MicrosoftがShared Source Common Language Infrastructure 2.0リリースでここに示しているように、アンマネージコードで使用するためです。確認するファイルはsscli20\clr \ src \ bcl \ system\string.csです。

Empty定数は、空の文字列値を保持します。コンパイラがこれをリテラルとしてマークしないように、Stringコンストラクタを呼び出す必要があります。

これをリテラルとしてマークすると、ネイティブからアクセスできるフィールドとして表示されないことを意味します。

この情報は、CodeProjectのこの便利な記事から見つけました。

于 2012-05-30T22:58:11.817 に答える
2

static readonlyフィールドはコンパイル時定数ではありません。これは単なる静的フィールドであり、初期化が終了したクラスの後で変更されるべきではありません。

現在の.net実装では、リフレクションを使用して変更することもできます。これにより、非常に奇妙な動作が発生します。

""代わりに、文字列リテラルとしてコンパイル時定数であるを使用できます。

于 2012-05-30T22:57:15.877 に答える
1

フィールドはreadonly実行時定数です。staticオブジェクト(またはフィールドがの場合はクラス)が初期化されるまで、値にバインドされません。

コンパイル時定数は、リテラル(とにかく、""本質的にはと同じものなど)とマークされたものです。String.Emptyconst

于 2012-05-30T22:58:41.913 に答える