コンパイラ例外投げるだろう、私は例としてint
を使用していますが、これはネット1で、.NET.Net 2+:なぜ(1 == null)でもコンパイラの例外がスローされないのですか?
の任意の値タイプに以下を適用する:.NET 2で(今
int i = SomeFunctionThatReturnsInt();
if(i == null) //compiler exception here
をまたは3.5)例外がなくなった。これはなぜ
は、私が知っている:
int? j = null; //nullable int
if(i == j) //this shouldn't throw an exception
問題はint?
がNULL可能であるとint
ので、今int?
への暗黙的なキャストを持っていることです。上記の構文はコンパイラの魔法です。本当に私たちがやっている:我々はi == null
を行う際
Nullable<int> j = null; //nullable int
//compiler is smart enough to do this
if((Nullable<int>) i == j)
//and not this
if(i == (int) j)
をだから今、我々が得る:C#はとにかくこれを計算するために、なぜそれが十分にスマートすることはできませんコンパイラのロジックをやっている
if((Nullable<int>) i == null)
考えることnull
のような絶対値を扱うときはしませんか?
コンパイラは、1 == 2と同じように、真ではないことを正しく認識します。 intがintに暗黙的にキャストできることを知るには十分にスマートですか?そしてそのint? nullと比較することができます。私はオプティマイザがブロック全体を取り除くのに十分スマートであると思う。 – Keith