DateTime? date = null;
string tmp = "a" + "(" + date ?? "blablabla" + ")";
Console.WriteLine(tmp);
これにより、次のようなものが出力されます: 'a ('
.
これはバグnull-coalescing operator
ですか?かっこを入れるdate ?? "blablabla"
と、エラーとして下線が引かれます。
DateTime? date = null;
string tmp = "a" + "(" + date ?? "blablabla" + ")";
Console.WriteLine(tmp);
これにより、次のようなものが出力されます: 'a ('
.
これはバグnull-coalescing operator
ですか?かっこを入れるdate ?? "blablabla"
と、エラーとして下線が引かれます。
まず、コンパイラのせいではなく、常に自分のせいであると想定する必要があります。select
壊れていません。??
オペレーターの Visual Studio 2010 実装は実戦でテストされていないと正直に思いますか? 期待に沿わないものに遭遇した場合は、期待を確認してください。マニュアルを取り出して、何が起こると想定されているかを正確に理解していることを確認してください。この場合、言語仕様を開きます。
仕様の §1.4 に進むと、演算子を優先グループにグループ化した表が表示されます。オンラインでも見つけることができます。特に、null 合体演算子は、下位の条件付き 3 項演算子と代入 および のみの上にある、一番下??
の近くにあります。加算演算子の下にあります。したがって、あなたの声明=>
string tmp = "a" + "(" + date ?? "blablabla" + ")";
はコンパイラによって次のように扱われます。
string tmp = (("a" + "(" + date) ?? ("blablabla" + ")"));
私は完全に衒学者になるつもりはなく、最初の加算式1も括弧で囲みます。そのステートメントの式の左側は決してnull ではないため、もちろん、常に(または+が true の場合は + を) に代入します。"a("
"a("
date.ToString()
date.HasValue
tmp
重要な点は、何が起こるべきかについて誤った期待を持っていたということであり、マニュアルに対して検証する必要があったということです。
かっこを入れる
date ?? "blablabla"
と、エラーとして下線が引かれます。
もちろん。エラーメッセージも読みましたか?と の間にはどちらの方向にも暗黙の変換がないため??
、 aDateTime?
と aでは実行できないことがおそらくわかります。これも言語仕様でカバーされています。§7.13 を参照してください。あなたはこのメッセージを読み、それに応答しなければなりません。表現しようとしているものと意味的に同等のものを取得するには、条件付き三項演算子に頼る必要があります。string
DateTime?
string
date.HasValue ? date.ToString() : "blablabla"
条件付き三項演算子の優先順位は非常に低いため、その全体を括弧で囲みます。
最後に、あなたのコードの正しく括弧で囲まれたバージョンはかなり醜く、読むのが楽しくなく、おそらく維持するのが楽しくないことがわかりました。簡単にしてください:
var tmp = String.Format("a({0})",
date.HasValue ? date.ToString() : "blablabla");
今、何が起こっているのか、何が起こるのかは明らかです。理解するのに考える必要はありません。遭遇する困難な問題に備えて、考えを保存してください。
1 : 注意してください。date.ToString
最初に評価されるものを正しく把握しようとする前に、(最も優先順位の高い)へのメソッド呼び出しを追加する必要があります。
ここに別のバージョンがあります:
DateTime? date = null;
string tmp = string.Format("a({0})",
date.HasValue ? date.ToString() : "blablabla");
string.Format
私は連結の代わりに本当に大好きです。
"blablabla"
は日付ではないため、 is を設定することはできませんdate?
。
string tmp = "a" + "(" + date ?? "blablabla" + ")";
と同等です
string tmp = ("a" + "(" + date) ?? ("blablabla" + ")");
それはあなたa(
がどこから来ているかです。
でも
string tmp = "a" + "(" + (date ?? DateTime.Now) + ")";
または同様のものが機能するはずです。
これはdate
、 が文字列ではなく、??
演算子が and の共通の基本型を判別できないことdate
が原因である可能性が最も高い"blablabla"
です。試してみてください(date.ToString() ?? "blablabla")
。しかし、これはあなたのニーズを満たさないdate.ToString()
でしょうnull
。
string tmp = "a" + "(" + (date ?? DateTime.Now) + ")";
動作するはずです。
null 合体演算子のバグではありません。
それは演算子の優先順位です:
"a" + "(" + date ?? "blablabla" + ")"
以下と同じです:
("a" + "(" + date.ToString() ) ?? ( "blablabla" + ")" )
("a" + "(" + date.ToString() )
nullではありません。