int foo;
int? bar;
if (bar != null)
{
foo = bar; // does not compile
foo = (int)bar; // compiles
foo = bar.Value; // compiles
}
最初のステートメントが間違っていることは長い間知っていましたが、常に私を悩ませてきました。null ではないことを確認したbar
のに、なぜコンパイラは文句を言うのでしょうか?
int foo;
int? bar;
if (bar != null)
{
foo = bar; // does not compile
foo = (int)bar; // compiles
foo = bar.Value; // compiles
}
最初のステートメントが間違っていることは長い間知っていましたが、常に私を悩ませてきました。null ではないことを確認したbar
のに、なぜコンパイラは文句を言うのでしょうか?
比較は言っているだけです-そうではありませんnull
、コンパイラはまだタイプを使用して、割り当てを行うことができるかどうかを確認します。
以下は、null チェックがなくてもコンパイルされます。
foo = (int)bar;
コンパイラは、プログラムが構文的に正しいかどうかのみをチェックします。null チェックは気にしません。
コンパイラは、int? int にするため、文句を言います。
想像してみてください:Nullable<int>
複数のスレッドからアクセスされる と型付けされたメンバー変数があるとします。そのような状況でコードを見てみましょう。
if(foo != null)
{
// expensive operation that takes time.
// what if another thread as nulled foo in the meantime?
int bar = foo;
}