C#6.0,.NET 4.51和VS2015 - 为什么字符串插值有效?

时间:2015-10-21 00:56:28

标签: c# .net c#-6.0

阅读以下内容后:

在我看来,除了String Interpolation之外,我在VS2015中针对.NET 4.51编译的任何项目都可以使用新的C#语言功能。

但是我使用VS2015定位4.51在我的开发机器上尝试了以下代码:

string varOne = "aaa";

string varTwo = $"{varOne}";

if (varTwo == "aaa")
{

}

并且我不仅没有收到编译器错误,而是按照预期的那样 varTwo 包含 aaa

有人可以解释为什么会出现这种情况,因为我不希望这种情况发生吗?我猜我错过了FormattableString的真正含义。有人可以举个例子吗?

2 个答案:

答案 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类,例如FormattableStringIFormattable,则会遇到编译时错误(除非您{{3看到帖子的底部部分)。

  

我猜我错过了FormattableString的真正含义。

FormattableString是.NET 4.6中引入的一种新类型,它允许您将新的字符串插值功能与您选择的自定义IFormatProvider一起使用。由于这不能直接在插值字符串上完成,因此您可以利用可以传递任何自定义格式的FormattableString.ToString(IFormatProvider)