11
int foo;
int? bar;

if (bar != null)
{
    foo = bar; // does not compile
    foo = (int)bar; // compiles
    foo = bar.Value; // compiles
}

最初のステートメントが間違っていることは長い間知っていましたが、常に私を悩ませてきました。null ではないことを確認したbarのに、なぜコンパイラは文句を言うのでしょうか?

4

4 に答える 4

21

比較は言っているだけです-そうではありませんnull、コンパイラはまだタイプを使用して、割り当てを行うことができるかどうかを確認します。

以下は、null チェックがなくてもコンパイルされます。

foo = (int)bar; 
于 2013-05-22T12:59:32.130 に答える
3

コンパイラは、プログラムが構文的に正しいかどうかのみをチェックします。null チェックは気にしません。

コンパイラは、int? int にするため、文句を言います。

于 2013-05-22T13:04:52.727 に答える
1

想像してみてください:Nullable<int>複数のスレッドからアクセスされる と型付けされたメンバー変数があるとします。そのような状況でコードを見てみましょう。

if(foo != null)
{
    // expensive operation that takes time.
    // what if another thread as nulled foo in the meantime?
    int bar = foo;
}
于 2013-05-22T13:09:17.560 に答える