null
は型自体を持つことができないため、コードサンプルのstring
へのキャストはnull
型になりません。あなたはこの証明をしたい場合は、あなたがnull
は、常に自分自身に等しいことを確認することができ、次のコードを実行し、関係なく、変数の型は、それが割り当てられていたものの次のとおりです。
string s = null;
IPAddress i = null;
Console.WriteLine(object.Equals(s, i)); // prints "True"
Console.WriteLine(object.ReferenceEquals(s, i)); // prints "True"
何キャストがないことは教えています選択するためにオーバーロードするコンパイラ。null
には型がないため、値がobject
またはstring
のオーバーロードを選択するかどうかはわかりません。だからあなたは「ここが文字列のように扱われるべきであるヌル値です」と言って助けているのです。
何が起こっているのかを見たい場合は、コードからILを見てください。だから、起こっていることすべてnullがスタック上にロードされているということである
ldnull
call void ConsoleApplication1.Program::Foo(string)
、および:メソッド呼び出しに関連するビットは(など、あなたの名前空間とクラス名に依存します)テキストのILに次のようなものですオーバーロード分解能がコンパイル時に実行されるので、コールするメソッドがILに焼き付けられるので、これは文字列を受け取るオーバーロードによって消費されます。
あなたがリンクをたどるしたくない場合は、その理由は、それがあるということです(ldnull
が何をするか見てみたい、とそれだけでスタックにゼロをロードするためにldc.i4.0
のようなものを使用した場合とは異なりますなぜ、その後this answerが表示された場合そうでなければCLRには存在しないサイズに依存しないゼロ)。
それで、 'null'を参照しているとき、スタックには正確に何が入りますか? –
@Matt - 低レベルの詳細を追加するように編集されました。これで十分ですか? –
@Greg:ありがとう - 私は仕事で忙しかったので、ILとECMA仕様をチェックする時間がなかった。これは私の知的かゆみを傷つけました。 –