6

観察: テキストがnullの場合、このメソッドはTrueを返します。私はFalseを期待していました。

return text?.IndexOf('A') != -1;

上記の行を ILSpy を使用して反映 (または IL を検査) すると、次のコードが生成されます。

return text == null || text.IndexOf('A') != -1;

私の期待に応えるために本当に必要なものは次のとおりです。

return text != null && text.IndexOf('A') != -1;

質問: Null 条件付きコードがOR式を生成した理由について、誰かが適切な説明を持っていますか?

完全なサンプル: https://dotnetfiddle.net/T1iI1c

4

1 に答える 1

7

上記の行には、null 条件演算子メソッドの呼び出しと比較という 2 つの操作が含まれています。最初の演算子の結果を中間変数として保存するとどうなりますか?

int? intermediate = text?.IndexOf('A');
return intermediate != -1;

明らかに null の場合もtextnull にintermediateなります。を使用してこれを任意の整数値と比較すると、!=が返されtrueます。

MSDN から(強調鉱山):

null 許容型との比較を実行するときに、null 許容型のいずれかの値が null で、もう一方がそうでない場合、 != (not equal) を除くすべての比較は false と評価されます。

このコードは、別の演算子を使用して null との比較が と評価されることを保証できる限り、null 条件演算子を使用して記述できfalseます。この場合、

return text?.IndexOf('A') > -1;

期待した出力が返されます。

于 2016-06-07T01:29:15.473 に答える