【问题标题】:C# 6.0, .NET 4.51 and VS2015 - Why does string interpolation work?C# 6.0、.NET 4.51 和 VS2015 - 为什么字符串插值有效?
【发布时间】:2016-01-19 20:30:35
【问题描述】:

阅读以下内容后:

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

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

string varOne = "aaa";

string varTwo = $"{varOne}";

if (varTwo == "aaa")
{

}

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

谁能解释为什么会这样,因为我没想到会这样?我猜我错过了 FormattableString 的真正含义。谁能举个例子?

【问题讨论】:

  • 或许将字符串转换为String.Format 调用足够聪明?
  • FormattableString 是在 .NET 4.5 中引入的。
  • @MarcinJuraszek 那么你是说 i3arnon 对 Rubenisme 的评论在“Does C# 6.0....”中是错误的吗?
  • 如果编译器可以针对它(由于异步等其他功能而无法使用),它可能甚至可以使用 1.0 - String.Format 永远存在(这是我理解的插值编译)
  • @TheEdge 请解释为什么您“不会期望这会起作用”-您链接到的帖子中的信息似乎应该足够了-因此不清楚您要澄清的部分。

标签: c# .net c#-6.0


【解决方案1】:

如 cmets 中所述,字符串插值在这种情况下有效,因为新编译器所做的只是在编译时将表达式转换为“等效的 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

【讨论】:

  • 不确定这个答案与other one 有何不同/更好(或者它如何解决 OP 尚未确定的问题)。
  • 增加了 FormattableString 类和示例的说明。
  • @codersl 语法错误 now.Hour --> DateTime.Now.Hour
  • 我刚刚在 VS2015 的一个新控制台项目中尝试了这个,它工作正常。我不得不以框架 .NET 4.6 为目标,因为它不适用于 4.5.x(根据 MSDN,这是最低要求)。
  • @codersl 抱歉错过了“now”的局部变量声明
【解决方案2】:

谁能解释为什么会这样,因为我没想到会这样?

这是有效的,因为您正在使用 VS2015 附带的新 Roslyn 编译器进行编译,并且知道如何解析字符串插值语法糖(它只是调用 string.Format 的正确重载)。如果您尝试利用与字符串插值配合得很好的 .NET Framework 4.6 类,例如 FormattableStringIFormattable,您会遇到编译时错误(除非您使用 add them yourself。请参阅底部部分的帖子)。

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

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

【讨论】:

  • @downvoter 所以请解释一下投反对票的原因。
  • 不是我,但 FormattableString 在 .Net 4.5 中
  • @DavidG 不符合文档:.NET Framework 自 4.6 起可用
  • 我觉得这与你和 DavidG 之间的讨论有关。
  • Downvote(不是我的)可能是因为您提供的信息已经包含在链接到的帖子 OP 中......但是有一些 OP 不理解 - 不太清楚是什么。
猜你喜欢
  • 2015-10-14
  • 2015-05-18
  • 2019-07-27
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
相关资源
最近更新 更多