文字列補間の問題

さようならStackExchange:

私のユニットテストが失敗する理由を理解しようとしています(下の3番目のアサート):

var date = new DateTime(2017, 1, 1, 1, 0, 0);

var formatted = "{countdown|" + date.ToString("o") + "}";

//Works
Assert.AreEqual(date.ToString("o"), $"{date:o}");
//Works
Assert.AreEqual(formatted, $"{{countdown|{date.ToString("o")}}}");
//This one fails
Assert.AreEqual(formatted, $"{{countdown|{date:o}}}");

私の知る限り、これは正しく動作するはずですが、フォーマットパラメータを正しく渡さない{countdown|o}ようです。コードからは見えます。なぜこれが失敗するのか?

user6996876:

この行の問題

Assert.AreEqual(formatted, $"{{countdown|{date:o}}}");

format stringエスケープする変数の後に3つの中引用符があり、左から右にエスケープが開始されるため、最初の2つの中括弧はフォーマット文字列の一部として扱われ、3番目の中括弧は終わりのものとして扱われます。

したがって、それは変形oo}、それを補間することができません。

これはうまくいくはずです

Assert.AreEqual(formatted, $"{{countdown|{date:o}"+"}");

単純な$"{date}}}"(つまり、のない変数の後ろに3つのカールがあるformat string)と、最初の波:括弧が閉じ引用符であると認識されるため、機能しますが、改行後の書式指定子の解釈は、正しい閉じ括弧の識別を中断します。

フォーマット文字列が文字列のようにエスケープされていることを証明するには、次のことを考慮してください

$"{date:\x6f}"

として扱われます

$"{date:o}"

最後に、二重にエスケープされた中引用符がカスタム日付形式の一部である可能性が完全にあるため、コンパイラーの動作は完全に合理的です。繰り返しますが、具体的な例

$"{date:MMM}}dd}}yyy}" // it's a valid feb}09}2017

構文解析は、式の文法規則に基づく正式なプロセスであり、一見するだけでは実行できません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事