首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# 6.0,.NET 4.51和VS2015 -为什么字符串内插要工作?

C# 6.0,.NET 4.51和VS2015 -为什么字符串内插要工作?
EN

Stack Overflow用户
提问于 2015-10-21 00:56:28
回答 2查看 5.4K关注 0票数 8

在阅读了以下内容之后:

在我看来,除了串内插之外,我在VS2015中针对.NET 4.51编译的任何项目都可以使用新的C#语言特性。

但是,我使用VS2015针对4.51在我的dev计算机上尝试了以下代码:

代码语言:javascript
复制
string varOne = "aaa";

string varTwo = $"{varOne}";

if (varTwo == "aaa")
{

}

我不仅没有收到编译器错误,而且它的工作原理是varTwo包含了aaa

有人能解释一下为什么会这样吗,因为我不认为这会起作用。我猜我错过了FormattableString的真正含义。有人能给我举个例子吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-21 01:44:21

正如注释中提到的,字符串内插在本例中起作用,因为所有新编译器都在编译时将表达式转换为“等效的string.Format调用”。

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

在编译时转换字符串内插以调用等效的string.Format调用。这就像以前一样保留了对本地化的支持(尽管仍然使用传统的格式字符串),并且没有通过字符串引入任何编译后注入的代码。

FormattableString是一个新的类,允许您在呈现之前检查字符串内插,这样您就可以检查值并防止注入攻击。

代码语言:javascript
复制
// 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
票数 14
EN

Stack Overflow用户

发布于 2015-10-21 01:26:57

有人能解释一下为什么会这样吗,因为我不认为这会起作用。

这是因为您正在使用VS2015附带的新罗斯林编译器进行编译,并且知道如何解析字符串内插语法糖(它只是调用string.Format的适当重载)。如果您试图利用.NET Framework4.6类与字符串插值(如FormattableStringIFormattable )很好地工作,您将遇到编译时错误(除非是http://www.thomaslevesque.com/2015/02/24/customizing-string-interpolation-in-c-6/ )。见文章的下面部分)。

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

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33249221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档