2012-05-30 4 views
8

今日、コンストラクタでデフォルトのパラメータ値を作成していました。String.Emptyをデフォルトのパラメータ値として使用できないのはなぜですか?

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

コンパイラは苦情を申し立てました。

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

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

.field public static initonly string Empty 

アム私は、コンパイル時の意味は、一定missunderstanding、またはそれは私が同意する必要がありますちょうどより多くwackynessのですか?

+0

エラーメッセージは、あなたの印象が「正確ではない」ことを示しています。 –

+1

さらに詳しい議論はこちら:http://stackoverflow.com/questions/507923/why-isnt-string-empty-a-constant –

答えて

4

Accepted answer to this質問String.Emptyは定数ではないのはなぜですか?

constの代わりにstatic readonlyが使用されるのは、ここではShared Source Common Language Infrastructure 2.0 Releaseに示されているように、アンマネージコードを使用するためです。調べるファイルはsscli20 \ clr \ src \ bcl \ system \ string.csです。

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

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

この便利な情報は、CodeProjectのarticleから見つかりました。

+0

私はこれを重複としてマークすることになっていると思いましたか?答えを出さない。 – Harrison

2

static readonlyフィールドはコンパイル時定数ではありません。静的なフィールドです。初期化が完了したクラスの後では変更しないでください。

現在の.net実装では、それを反射で変更することもできます。これは本当に奇妙な動作につながります。

代わりに""を使用できます。文字列リテラルはコンパイル時定数です。

1

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

コンパイル時の定数は、"" - とにかくString.Emptyと同じものです。constと書かれたものです。

関連する問題