23

int?最近、文字列を で連結し、その後に別の文字列を追加するという奇妙なバグがありました。

私のコードは基本的にこれと同等でした:

int? x=10;
string s = "foo" + x ?? 0 + "bar";

驚くべきことに、これは次のように、警告や互換性のない型エラーなしで実行およびコンパイルされます。

int? x=10;
string s = "foo" + x ?? "0" + "bar";

そして、これにより、予期しない型の非互換性エラーが発生します。

int? x=10;
string s = "foo" + x ?? 0 + 12;

この簡単な例と同様に:

int? x=10;
string s = "foo" + x ?? 0;

誰かがこれが私にどのように機能するかを説明できますか?

4

2 に答える 2

27

null 合体演算子の優先順位は非常に低いため、コードは次のように解釈されます。

int? x = 10;
string s = ("foo" + x) ?? (0 + "bar");

この例では、両方の式が文字列であるため、コンパイルは行われますが、目的の処理は行われません。次の例では、演算子の左側??は文字列ですが、右側は整数であるため、コンパイルされません。

int? x = 10;
string s = ("foo" + x) ?? (0 + 12);
// Error: Operator '??' cannot be applied to operands of type 'string' and 'int'

もちろん、解決策は括弧を追加することです:

int? x = 10;
string s = "foo" + (x ?? 0) + "bar";
于 2010-07-15T19:47:50.737 に答える
11

演算子は演算子よりも優先順位??が低いため、式は実際には次のように機能します。+

string s = ("foo" + x) ?? (0 + "bar");

最初に文字列"foo"と の文字列値xが連結され、それが null になる場合 (それはあり得ません)、 の文字列値0と文字列"bar"が連結されます。

于 2010-07-15T19:47:51.753 に答える