c# 6.0, . net 4.51和VS2015 -为什么字符串插值工作

本文关键字:VS2015 为什么 字符串 工作 插值 net | 更新日期: 2023-09-27 18:18:39

阅读以下内容:

    c# 6.0需要CLR c# 6.0可以在。net 4.0下工作吗?

在我看来,除了字符串插值之外,我在VS2015中针对。net 4.51编译的任何项目都可以使用新的c#语言功能。

然而,我在我的开发机器上使用VS2015瞄准4.51尝试了以下代码:

string varOne = "aaa";
string varTwo = $"{varOne}";
if (varTwo == "aaa")
{
}

,我不仅没有收到编译错误,它工作的varTwo包含aaa,如预期的

有人能解释为什么是这种情况,因为我不会期望这工作?我猜我错过了FormattableString真正的意思。有人能给我举个例子吗?

c# 6.0, . net 4.51和VS2015 -为什么字符串插值工作

正如在注释中提到的,字符串插值在这种情况下起作用,因为所有新的编译器所做的就是将表达式转换为"等效字符串"。格式调用"

从https://msdn.microsoft.com/en-us/magazine/dn879355.aspx

字符串插值在编译时被转换为调用等效的字符串。格式的电话。这保留了对本地化的支持(尽管仍然使用传统的格式字符串),并且没有通过字符串引入任何编译后的代码注入。


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

有人能解释为什么是这种情况,因为我不会期望这工作?

这可以工作,因为你正在用VS2015附带的新Roslyn编译器编译,并且知道如何解析字符串插值语法糖(它只是调用string.Format的适当过载)。如果你试图利用。net Framework 4.6类很好地处理字符串插值,如FormattableStringIFormattable,你会遇到编译时错误(除非你自己添加它们)。

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

FormattableString是。net 4.6中引入的一个新类型,它允许你使用新的字符串插值特性和你选择的自定义IFormatProvider。由于这不能直接在插入的字符串上完成,您可以利用FormattableString.ToString(IFormatProvider),它可以传递任何自定义格式。