阅读以下内容后:
在我看来,除了String Interpolation之外,我在VS2015中针对.NET 4.51编译的任何项目都可以使用新的C#语言功能。
但是我使用VS2015定位4.51在我的开发机器上尝试了以下代码:
string varOne = "aaa";
string varTwo = $"{varOne}";
if (varTwo == "aaa")
{
}
并且我不仅没有收到编译器错误,而是按照预期的那样 varTwo 包含 aaa 。
有人可以解释为什么会出现这种情况,因为我不希望这种情况发生吗?我猜我错过了FormattableString的真正含义。有人可以举个例子吗?
答案 0 :(得分:13)
正如评论中所提到的,字符串插值在这种情况下起作用,因为所有新编译器都在编译时将表达式转换为“等效的string.Format调用”。
来自https://msdn.microsoft.com/en-us/magazine/dn879355.aspx
在编译时转换字符串插值以调用等效的string.Format调用。这样就可以像以前一样支持本地化(虽然仍然使用传统的格式字符串),并且不会通过字符串引入任何后编译代码注入。
FormattableString
是一个新类,允许您在渲染之前检查字符串插值,以便您可以检查值并防止注入攻击。
// this does not require .NET 4.6
DateTime now = DateTime.Now;
string s = $"Hour is {now.Hour}";
Console.WriteLine(s);
//Output: Hour is 13
// this requires >= .NET 4.6
FormattableString fs = $"Hour is {now.Hour}";
Console.WriteLine(fs.Format);
Console.WriteLine(fs.GetArgument(0));
//Output: Hour is {0}
//13
答案 1 :(得分:8)
有人可以解释为什么会出现这种情况,因为我没想到这会起作用吗?
这是有效的,因为您正在使用VS2015附带的新Roslyn编译器进行编译,并且知道如何解析字符串插值语法糖(它只是调用string.Format
的正确重载)。如果您尝试利用可以很好地处理字符串插值的.NET Framework 4.6类,例如FormattableString
或IFormattable
,则会遇到编译时错误(除非您{{3看到帖子的底部部分)。
我猜我错过了FormattableString的真正含义。
FormattableString
是.NET 4.6中引入的一种新类型,它允许您将新的字符串插值功能与您选择的自定义IFormatProvider
一起使用。由于这不能直接在插值字符串上完成,因此您可以利用可以传递任何自定义格式的FormattableString.ToString(IFormatProvider)
。