Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#6.0、.NET 4.51和VS2015-为什么字符串插值工作?_C#_.net_C# 6.0 - Fatal编程技术网

C#6.0、.NET 4.51和VS2015-为什么字符串插值工作?

C#6.0、.NET 4.51和VS2015-为什么字符串插值工作?,c#,.net,c#-6.0,C#,.net,C# 6.0,在阅读以下内容后: 在我看来,除了我在VS2015中针对.NET4.51编译的任何项目之外,我还可以使用新的C语言功能 但是,我使用VS2015 4.51在我的开发机器上尝试了以下代码: string varOne = "aaa"; string varTwo = $"{varOne}"; if (varTwo == "aaa") { } 我不仅没有收到编译器错误,它还像预期的那样作为varTwo包含aaa 有人能解释一下为什么会这样,因为我没料到这会奏效?我猜我错过了Forma

在阅读以下内容后:

在我看来,除了我在VS2015中针对.NET4.51编译的任何项目之外,我还可以使用新的C语言功能

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

string varOne = "aaa";

string varTwo = $"{varOne}";

if (varTwo == "aaa")
{

}
我不仅没有收到编译器错误,它还像预期的那样作为varTwo包含aaa

有人能解释一下为什么会这样,因为我没料到这会奏效?我猜我错过了FormattableString的真正含义。有人能给我举个例子吗

有人能解释一下为什么会这样,因为我没料到这会奏效

这是因为您使用VS2015附带的新Roslyn编译器进行编译,并且知道如何解析字符串插值语法糖(它只调用
string.Format
的适当重载)。如果您试图利用.NETFramework4.6类,这些类可以很好地与字符串插值一起工作,例如or,那么您将遇到编译时错误(除非您。请参阅本文的下半部分)

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


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

如注释中所述,字符串插入在这种情况下起作用,因为新编译器所做的一切就是将表达式转换为编译时的“等效字符串.格式调用”

字符串插值在编译时被转换为调用等效的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

也许将字符串转换为
string.Format
调用足够聪明?
FormattableString
是在.NET 4.5中引入的。@MarcinJuraszek所以你是说i3arnon对Rubenisme的评论在“C#6.0….吗?”中是错误的吗?如果编译器可以将其作为目标,它甚至可以与1.0一起工作(由于异步等其他特性而不能)-
String.Format
永远存在(据我所知,这就是插值编译成的格式)@Edge请解释为什么您“没有料到这会起作用”“-你链接到的帖子中的信息似乎已经足够了-所以不清楚你想澄清的部分。@downvoter很有启发性地给出了一个否决的理由。不是我,而是在.Net 4中。5@DavidG不是根据4.6版本提供的docs:.NET框架,我觉得它与您和DavidG.Downvote之间的讨论有关(不是我的)可能是因为您提供的信息已经包含在OP后链接中…但OP不了解某些内容-不清楚是什么原因。不确定这个答案与OP有何不同/更好(或者它如何解决OP尚未确定的问题)。添加了FormattableString类和示例的说明。@codersl语法错误now.Hour-->DateTime.now.HourI刚刚在VS2015中的一个新控制台项目中尝试了这个方法,效果很好。但我必须将framework.NET 4.6作为目标,因为它不能与4.5.x一起使用(根据MSDN,这是最低要求).@codersl抱歉,您的局部变量声明“now”未被执行