4

なぜC#コンパイラは、割り当てられたnull許容値型では.ctorなく、デフォルトの暗黙的なパラメータなしを単純に呼び出さないのですか?intobjnull

次のようなコードがあるとしましょう。

Nullable<int> ex1 = new Nullable<int>();
Nullable<int> ex2 = null;
Nullable<int> ex3 = new Nullable<int>(10); 

これらの2行のIL出力は次のようになります。

ここに画像の説明を入力してください

最後のステートメントのみが.ctor必要であり、フィールドがゼロの2つの最初のステートメントのインスタンスを作成できないのはなぜですか?

4

3 に答える 3

5

なぜC#コンパイラは、nullが割り当てられたnull許容値型.ctorではなく、デフォルトの暗黙的なパラメータなしを単純に呼び出さないのですか?intobj

Nullable<T>(または他の値型)には実際にはパラメーターのないコンストラクターがないためです。これは、逆コンパイラーで確認するか、リフレクションを使用して確認できます(例typeof(Nullable<>).GetConstructors())。

new T()C#で値型を記述する場合、パラメーターなしのコンストラクターを呼び出すように見えます(C#仕様ではコンストラクターとも呼ばれます)が、値型にはパラメーターなしのメソッドTがないため、実際にはそうではありません。.ctor

于 2012-06-05T01:51:40.937 に答える
1

C#コンパイラがデフォルトの暗黙的なパラメータなしを単純に呼び出さないのはなぜですか.ctor

のような値型System.Nullable<T>には、明示的なパラメーターなしのコンストラクターを含めることができないためです。これは、値型を定義するための要件です。1つの値型は明示的なパラメーターなしのコンストラクターを持つことができないためinitobj、CILで値型をデフォルトで構築する唯一の方法です。

于 2012-06-04T22:03:41.990 に答える
0

MSDNのドキュメントに従って、initobj命令は値の型を初期化し、そのフィールドをゼロまたはヌルにするためです。その上でデフォルトのコンストラクターメソッドを呼び出しても、追加の値は提供されません。最後の例は値を渡すため、非常に特殊なコンストラクターと呼ばれます。

于 2012-06-04T22:04:38.593 に答える