これをLinqPadに打ち込みました:
var t = new DateTime();
t.Dump();
(t == null).Dump();
そして、これを得ました:
IL_0000: ldloca.s 00
IL_0002: initobj System.DateTime
IL_0008: ldloc.0
IL_0009: call LINQPad.Extensions.Dump
IL_000E: pop
IL_000F: ldc.i4.0
IL_0010: call LINQPad.Extensions.Dump
はい、コンパイラはそれを次のようにコンパイルします。
var t = new DateTime();
t.Dump();
(false).Dump();
興味深いことに、独自の構造体 ( TestStruct
) を作成してこれを試してみると、次のようになります。
TestStruct t;
(t == null).Dump();
TestSruct
...コンパイラは、との間の等号比較を行うことができないと不平を言いますnull
。
アップデート
コメントで、Paolo は、この最後の現象を報告している別の StackOverflow 投稿を指摘しています。どうやら==
and演算子をオーバーロードすることで、値型は からへ!=
の自動変換の対象になります。これらの演算子をオーバーロードしていない場合、この暗黙的な変換は意味がないため、エラーが発生します。t == null
(Nullable<TestClass>)t == (Nullable<TestClass>)null