4

c#.net 4 コードベースで、このような不適切なコードに遭遇しました。

DateTime myDate = someValue;
If (myDate==Null)
    Do Something

この状態は決して起こらないと思いました。

コンパイラは、これらの null 非許容の構造体比較をどのように処理しますか?

当初、私たちはそれがコンパイルされることに驚きました...しかし、次のような一定の比較を確実に行うことができるという点で合理化しました:

If(1==2)

これも true を解決することはありません...しかし、その場合、コンパイラはそれらが定数であると簡単に判断できます。Null 非許容の比較を最適化またはロールアップしますか?

4

1 に答える 1

7

これを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

于 2012-02-23T00:03:42.913 に答える