【发布时间】:2017-06-27 18:37:03
【问题描述】:
我正在尝试找出我的单元测试失败的原因(下面的第三个断言):
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}}}");
AFAIK,这应该可以正常工作,但它似乎没有正确传递格式化参数,它只是{countdown|o} 出现在代码中。知道为什么会失败吗?
【问题讨论】:
-
看来(虽然我讨厌这样说)这是一个编译器错误。
-
@DavidG:可能是编译器错误,也可能是底层格式库中的错误,但我同意这里有些东西闻起来很糟糕。至少应该调查一下。
-
这似乎与评估结束插值括号的方式有关。外括号上方的代码关闭了插值
{{countdown|**{**date:o}}**}**,括号之间的空格使其计算为内括号{{countdown|**{**date:o**}**_}}。 -
请注意,问题不是由字符串插值引起的,而是在
string.Format内部某处(例如string.Format("{{{0:o}}}", date)) -
看起来
o被解释为自定义日期时间格式的一部分。而且由于它不是有效的格式说明符,它只是被复制到输出。请参阅(自定义日期和时间格式字符串文档页面](msdn.microsoft.com/en-us/library/…)。
标签: c# c#-6.0 string-interpolation