5
DateTime? date = null;
string tmp = "a" + "(" + date ?? "blablabla" + ")";

Console.WriteLine(tmp);

これにより、次のようなものが出力されます: 'a ('.

これはバグnull-coalescing operatorですか?かっこを入れるdate ?? "blablabla"と、エラーとして下線が引かれます。

4

7 に答える 7

6

まず、コンパイラのせいではなく、常に自分のせいであると想定する必要があります。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.HasValuetmp

重要な点は、何が起こるべきについて誤った期待を持っていたということあり、マニュアルに対して検証する必要があったということです。

かっこを入れるdate ?? "blablabla"と、エラーとして下線が引かれます。

もちろん。エラーメッセージも読みましたか?と の間にはどちらの方向にも暗黙の変換がないため??、 aDateTime?と aでは実行できないことがおそらくわかります。これも言語仕様でカバーされています。§7.13 を参照してください。あなたはこのメッセージを読み、それに応答しなければなりません。表現しようとしているものと意味的に同等のものを取得するには、条件付き三項演算子に頼る必要があります。stringDateTime?string

date.HasValue ? date.ToString() : "blablabla"

条件付き三項演算子の優先順位は非常に低いため、その全体を括弧で囲みます。

最後に、あなたのコードの正しく括弧で囲まれたバージョンはかなり醜く、読むのが楽しくなく、おそらく維持するのが楽しくないことがわかりました。簡単にしてください:

var tmp = String.Format("a({0})", 
                       date.HasValue ? date.ToString() : "blablabla");

今、何が起こっているのか、何が起こるのかは明らかです理解するのに考える必要はありません。遭遇する困難な問題に備えて、考えを保存してください。

1 : 注意してください。date.ToString最初に評価されるものを正しく把握しようとする前に、(最も優先順位の高い)へのメソッド呼び出しを追加する必要があります。

于 2013-07-09T13:04:43.153 に答える
3

ここに別のバージョンがあります:

DateTime? date = null;
string tmp = string.Format("a({0})", 
                           date.HasValue ? date.ToString() : "blablabla");

string.Format私は連結の代わりに本当に大好きです。

于 2013-07-09T13:01:09.987 に答える
2

"blablabla"は日付ではないため、 is を設定することはできませんdate?


string tmp = "a" + "(" + date ?? "blablabla" + ")";

と同等です

string tmp = ("a" + "(" + date) ?? ("blablabla" + ")");

それはあなたa(がどこから来ているかです。


でも

string tmp = "a" + "(" + (date ?? DateTime.Now) + ")";

または同様のものが機能するはずです。

于 2013-07-09T12:55:57.750 に答える
1

C#言語仕様§1.4より

次の表は、C# の演算子をまとめたもので、優先度の高いものから順に演算子のカテゴリを示しています。同じカテゴリの演算子の優先順位は同じです。

加法演算子は、null合体演算子よりも優先順位が高いと言われています。

そのため、+より優先順位が高く、式が最初に機能??するのはそのためです。"blablabla" + ")"

dateisであるためnull、ステートメントは次のように機能します。

string tmp = "a" + "(" + null;

そして通常、結果はa(

于 2013-07-09T12:58:13.227 に答える
0

これはdate、 が文字列ではなく、??演算子が and の共通の基本型を判別できないことdateが原因である可能性が最も高い"blablabla"です。試してみてください(date.ToString() ?? "blablabla")。しかし、これはあなたのニーズを満たさないdate.ToString()でしょうnull

string tmp = "a" + "(" + (date ?? DateTime.Now) + ")";

動作するはずです。

于 2013-07-09T12:55:06.127 に答える
0

null 合体演算子のバグではありません。

それは演算子の優先順位です:

"a" + "(" + date ?? "blablabla" + ")"

以下と同じです:

("a" + "(" + date.ToString() ) ?? ( "blablabla" + ")" )

("a" + "(" + date.ToString() )nullではありません。

于 2013-07-09T12:57:07.313 に答える