在阅读了以下内容之后:
在我看来,除了串内插之外,我在VS2015中针对.NET 4.51编译的任何项目都可以使用新的C#语言特性。
但是,我使用VS2015针对4.51在我的dev计算机上尝试了以下代码:
string varOne = "aaa";
string varTwo = $"{varOne}";
if (varTwo == "aaa")
{
}我不仅没有收到编译器错误,而且它的工作原理是varTwo包含了aaa。
有人能解释一下为什么会这样吗,因为我不认为这会起作用。我猜我错过了FormattableString的真正含义。有人能给我举个例子吗?
发布于 2015-10-21 01:44:21
正如注释中提到的,字符串内插在本例中起作用,因为所有新编译器都在编译时将表达式转换为“等效的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发布于 2015-10-21 01:26:57
有人能解释一下为什么会这样吗,因为我不认为这会起作用。
这是因为您正在使用VS2015附带的新罗斯林编译器进行编译,并且知道如何解析字符串内插语法糖(它只是调用string.Format的适当重载)。如果您试图利用.NET Framework4.6类与字符串插值(如FormattableString或IFormattable )很好地工作,您将遇到编译时错误(除非是http://www.thomaslevesque.com/2015/02/24/customizing-string-interpolation-in-c-6/ )。见文章的下面部分)。
我猜我错过了FormattableString的真正含义。
FormattableString是在.NET 4.6中引入的一种新类型,它允许您使用新的字符串插值特性和您选择的自定义IFormatProvider。因为这不能直接在插值字符串上完成,所以您可以利用FormattableString.ToString(IFormatProvider),它可以传递任何自定义格式。
https://stackoverflow.com/questions/33249221
复制相似问题