2017-04-11 8 views
2

次のようなコードが追加されました。オペレータがの最後のを表示させます。LastNameがC#の文字列連結演算子で表示されないのはなぜですか?

期待される結果:最初がNULLだった場合最初が「により」とすることを「置換されるというものであった」最後が結果としてちょうど最後を与えると連接されるだろう。

実際の結果:私が得た結果はちょうどの最初のでした。

var first = "Joe"; 
var last = "Smith" 
var str1 = first + last; // gives "JoeSmith" 
var str2 = first ?? "" + last // gives "Joe" 
+1

が、私は理解していない返すnullではありません。 [null-coalescing operator](https://msdn.microsoft.com/en-us/library/ms173224.aspx)は、NULLでない場合は左側のオペランドを返し、そうでない場合は、右側のオペランドを評価して返す必要がありますハンドオペランド。あなたの例では '' Joe ''は明らかにnullではありません。 –

+0

確かに、3番目の文を明確にしたいと思うかもしれません - 「最初のものがヌルであれば、それは最後の名前だと思ったのですか? –

+0

オペレータの優先順位。 –

答えて

12

これは優先事項です。あなたのコードが効果的であるので+は、より緊密に??超えるバインド:

var str2 = first ?? ("" + last) 

あなたはおそらく意味のようですね:

var str2 = (first ?? "") + last 

しかし、誰ポイントがヌルで文字列の連結は、文字列の連結と等価であることを考えると、ありません空の文字列を使用しているので、str1と同じようにfirst + lastを使用してください。

+0

Thanks @ jon-skeet意味がある。私は朝7時までにコードするよりもうまくいけません。 –

+0

@PeterKellner:時刻がカフェインレベルほど重要ではないことがわかりました:) –

+0

私は、修正することがあまりないときに他の人の回答を編集したくないです。また、私は日付を誤読し、これはそれよりずっと古いと思った。 –

2

null合体オペレータ??の予想される動作です。最初の値を使用します(nullでない場合は2番目の値になります)。これは置き換え変数をどのように表示されるかを考えてみましょう:

var str2 = "Joe" ?? "" + "Smith"; 

「ジョー」がnullではないので、それはそれにstr2を設定し、式の残りの部分を無視します。あなただけの最初の名前を合体したい場合は、空の文字列でfirstのいずれかヌルのインスタンスを置き換えるために括弧でグループにそれを必要があります:

var str2 = (first ?? "") + last; 

しかし、これは本当にあなたから任意の違いはありません。あなたのヌルは単に空の文字列になり、同じものを生成するので、既存のコード。 MSDNから

0

?演算子はヌル合体演算子と呼ばれます。オペランドがヌルでない場合は、左側のオペランドを返します。それ以外の場合は、右側のオペランドを返します。

最初ので、それはあなたが唯一の最後に名前が示されたことが予想される理由「ジョー」が

+1

OPは優先順位について混乱していましたが、彼はその部分が連結されていくことを期待していました。 –

+0

これがトピックとして閉じられた理由を説明してください。 –

関連する問題