阅读以下内容后:
在我看来,除了String Interpolation,我在VS2015中针对.NET 4.51编译的任何项目都可以使用新的C#语言功能.
但是我使用VS2015定位4.51在我的开发机器上尝试了以下代码:
string varOne = "aaa";
string varTwo = $"{varOne}";
if (varTwo == "aaa")
{
}
Run Code Online (Sandbox Code Playgroud)
并且我不仅没有收到编译器错误,它的工作原理是varTwo 包含aaa,如预期的那样.
有人可以解释为什么会这样,因为我不希望这个工作吗?我猜我错过了FormattableString的真正含义.有人能举个例子吗?
cod*_*rsl 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
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么会这样,因为我不希望这个工作吗?
这是有效的,因为您正在使用VS2015附带的新Roslyn编译器进行编译,并且知道如何解析字符串插值语法糖(它只是调用正确的重载string.Format).如果你试图利用与字符串插值很好地工作的.NET Framework 4.6类,比如FormattableStringor IFormattable,你会遇到编译时错误(除非你自己添加它们.请参阅帖子的下半部分).
我猜我错过了FormattableString的真正含义.
FormattableString是.NET 4.6中引入的一种新类型,它允许您使用新的字符串插值功能和IFormatProvider您选择的自定义.由于这不能直接在插值字符串上完成,因此您可以利用FormattableString.ToString(IFormatProvider)可以传递任何自定义格式的字符串.
| 归档时间: |
|
| 查看次数: |
4289 次 |
| 最近记录: |