-1

一般に、短絡orオペレータ||は、の右側を無視するか、左側がtrueと評価された場合を無視します。どうやら、これには例外が見つかりました。

以下をチェックしてください:

if (foo == null || bar != true ? foo.Count == 0 : true)
{

}

foo.Countこのコードは、がnullであるため、コマンドでnull参照例外をスローしfooます。そして当然、ブール論理はこれを可能にします。ただし、がnullの場合、は短絡し、式の右辺を評価することすらできないfooと予想されますが、それでもそうなり、例外がスローされます。or

これは私のコードまたはC#コンパイラのバグですか?このケースを処理するC#仕様の一部はありますか?

4

4 に答える 4

17

これは、ステートメントが期待どおりに評価されていないためです。

追加の括弧が必要です。

if(foo == null || (bar != true ? foo.Count == 0 : true))

現在の記述方法は、(演算子の優先順位のため)と同等です。

if((foo == null || bar != true) ? foo.Count == 0 : true)    
于 2012-11-09T17:40:27.003 に答える
11

いいえ、正しく機能します。演算子の優先順位を参照してください。||前に評価されます?:

つまり、最初に評価foo == null || bar != trueしてから、次? foo.Count == 0 : trueのようになります。

if ((foo == null || bar != true) ? foo.Count == 0 : true)
{

}

ここで短循環を使用する場合は、次のようにする必要があります。

if (foo == null || (bar != true ? foo.Count == 0 : true))
{

}
于 2012-11-09T17:40:42.047 に答える
3

チェックしている状態の周りの括弧を想像してみてください。

if ((foo == null || bar != true) ? foo.Count == 0 : true)
{

}

したがって、がの場合foonullを読み込もうとしているfoo.Countため、当然、結果は。になりNullReferenceExceptionます。

于 2012-11-09T17:41:27.387 に答える
2

演算子の優先順位と結合法則によると、条件演算子の?:優先順位は最も低くなります。したがって、最後に実行されます。このような:

(foo == null || bar != true) ? foo.Count == 0 : true
于 2012-11-09T17:46:42.430 に答える