2011-11-29 16 views
9

InnerExceptionがnullの場合、null参照例外がスローされます。なぜこれがnull参照例外をスローしますか?

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message; 

が、これではないでしょう:

String s = " inner exception: " + (e.InnerException == null ? "None" : e.InnerException.Message); 

上記ビルド罰金の両方。私は前者が何をしようとしているのかを理解することができず、その結果、評価することになるでしょうe.InnerException.Message。なぜ彼らは同等ではないのですか?

答えて

22

これは、最初の文がをtrueまたはfalseと評価しているためです。すべて約の演算子の優先度です。そのため、2番目の式はかっこ(())のため正しく動作します。

See this reference for Operator Precedence+演算子は、等価演算子==より前に評価されます。

+0

そのため、演算子の優先順位について考える必要がないように、明らかではないケースに大括弧を含めることが最善です。 – Malcolm

+0

@Malcolm私は完全に同意します。 –

4

これは演算子の優先順位によるものです。この場合、+演算子は==演算子よりも優先順位が高いため、コードが正しい順序で実行されるようにデフォルトの優先順位を上書きするには括弧を使用する必要があります。

あなたは、C#言語仕様で、それについてのすべてを読むことができます:

Operator precedence and associativity

式は複数の演算子が含まれ、 演算子の優先順位は、個々の事業者が 評価される順序を制御します。

3

この:

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message; 

は、おそらく次のように評価されている:オペレーションの

String s = (" inner exception: " + e.InnerException) == null ? "None" : e.InnerException.Message; 
2

注文:

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message; 

はそれがありませんどの(" inner exception: " + e.InnerException) == null ?として評価されます。

関連する問題