22

私は次のことを試しました.2つの文字列を連結し、空の文字列をnullに置き換えます。

string a="Hello";
string b=" World";

-- デバッグ (? が print であることをおかしなことに、読みやすさにはまったく役立たない...)

 ? a ?? "" + b ?? "" 

->「こんにちは」

正しいです:

? (a??"")+(b??"")
"Hello World"

「Hello World」、または a が null の場合は単に「World」を期待していました。明らかに、これは演算子の優先順位と関係があり、括弧で克服できます。この新しい演算子の優先順位を文書化する場所はどこにありますか。

(おそらくstringbuilderまたはString.Concatを使用する必要があることに気づきました)

ありがとう。

4

4 に答える 4

39

優先順位をどうしたいか ECMA によるもの、MS 仕様によるもの、および csc が実際に行うことは別として、私は 1 つのアドバイスがあります。

これをしないでください

次のように書く方がはるかに明確だと思います。

string c = (a ?? "") + (b ?? "");

または、文字列連結の null が空の文字列になる場合は、次のように記述します。

string c = a + b;

編集: 文書化された優先順位に関して、C# 3.0 仕様(Word ドキュメント) とECMA-334の両方で、追加は ?? よりも厳密にバインドされ、代入よりも厳密にバインドされます。別の回答で指定されたMSDNリンクは、間違っていて奇妙です.IMO. 2008 年 7 月に行われたページには、条件演算子を移動した変更が示されていますが、明らかに間違っています。

于 2009-02-04T12:56:43.880 に答える
6

演算子の優先順位に依存しないでください。コードの動作方法を常に明示的に指定してください。コードに戻ったときに、自分自身と他の人に恩恵を与えてください。

(a ?? "") + (b ?? "")

これにより、あいまいさの余地がなくなります。あいまいさはバグの温床です。

于 2009-02-04T12:56:24.177 に答える
5

演算子の優先順位はMSDNに記載されています。

ただし、MSDN の優先順位は、同じく Microsoft からダウンロード可能な C# 仕様と ECMAの仕様の両方の優先順位と矛盾しています。これは少し奇妙です。

いずれにせよ、Jon Skeet が回答で述べたように、演算子の優先順位に依存するのではなく、括弧を使用して明示するのが最善です。

于 2009-02-04T12:17:07.690 に答える
2

http://msdn.microsoft.com/en-us/library/6a71f45d.aspxhttp://en.csharp-online.net/ECMA-334:_14.2.1_Operator_precedence_and_associativityが ?? に異なる優先順位を与えるのは興味深いことです。

msdn:

  1. 条件付き
  2. 割り当て
  3. ヌル合体
  4. ラムダ

ECMA:

  1. ヌル合体
  2. 条件付き
  3. 割り当て

msdn が間違っているに違いないと思います。

string a = null;
string b = a ?? "foo";
// What is b now?
于 2009-02-04T12:25:34.897 に答える