4

次のコードが C#.NET デザイナーで許可されていない理由の説明を探していることに非常に興味があります。

const foo f = new foo();

次のエラーメッセージが表示されます。

「f」は「ConsoleApplication1.foo」タイプです。文字列以外の参照型の const フィールドは、null でのみ初期化できます。

質問は次のとおりです。なぜですか。誰かがこのconst要件を説明できますか?

前もって感謝します。

4

4 に答える 4

10

aはコンパイル時constに解決できるものでなければならないためです。

new foo();実行時に実行されます。

おそらく、readonlyキーワードを使用して、コンストラクターの外で初期化できないようにする必要があります。

private readonly foo f = new foo();
于 2012-07-17T14:16:07.033 に答える
3

constC# の a はコンパイル時の定数でなければならないためです。したがって、const(ほとんどの参照型で) 有効なオプションは のみですnull

1 つの例外はstring、文字列リテラルに割り当てることができる場合です。

// allowed because string literals are compile-time
private const string Message = "Hello World";

フィールドを持つことができますreadonly。これにより、フィールドを初期化子またはコンストラクターでのみ設定できます。本質的に、これは に似てconstいますが、実行時に決定され、staticまたはインスタンスになる可能性があります (すべてのconstフィールドはstatic自動的に行われます)。

ただし、参照とは参照readonlyが読み取り専用であることを意味するだけであり、参照先のオブジェクトも読み取り専用であることを意味するわけではないことに注意してください(もちろん、オブジェクトが のように設計上不変でない限り)。string

例えば:

private readonly List<string> validStrings = new List<string> { "Apple", "Orange", "Pear" };

validStrings上記はですが、新しい参照に割り当てて readonly変更できないことを意味するだけです。ただし、オブジェクトが変更可能な場合は、参照するものを変更できます。validStrings

// allowed, you can change what it refers to
validStrings.Clear();

// disallowed, cannot change what the reference refers to outside of constructor
validStrings = new List<string> { "Other", "Stuff" };

お役に立てれば...

于 2012-07-17T14:16:05.557 に答える
3

const は、値がコンパイル時に既知であることを示します。new はオブジェクトを割り当てるため (プログラムが実行されていない場合は不可能です)、新しいオブジェクトに const を設定することはできません。次のように、やや似たようなことを達成できます。

static readonly Foo foo = new Foo()
于 2012-07-17T14:17:30.713 に答える
2

実際には、エラー テキストは、フィールド (クラス (または構造体) に属するメソッドの外部で宣言) ではなく、ローカル変数 (メソッド内で宣言) であるため、混乱を招きます。

const他の人が言うように、 以外の参照型には役に立たないため、削除する必要がありstringます。

于 2012-07-17T14:26:20.517 に答える