在.VS 2015 NET 4.5中使用字符串插值和名称

我在我的代码中使用了诸如$"hello {person}"nameof(arg1) ,但在检查项目属性时,我的目标是.NET 4.5。

这个可以吗? 我认为这些东西是在4.6中引入的。

该项目在我的机器上构建并运行正常 – 但我担心在部署它时会出现问题。

它是一个编译器function,而不是框架function。 我们在Visual Studio 2015中成功使用了.NET 3.5项目的这两个function。

简而言之,编译器将$"hello {person}"String.Format("hello {0}", person) ,将nameof(arg1)"arg1" 。 这只是语法糖。

运行时看到一个String.Format调用(或分别是字符串文字“arg1”),并且不知道(也不关心)原始源代码的样子。 从.NET Framework的早期开始就支持String.Format ,因此没有什么可以阻止您定位早期版本的框架。

现有的答案谈到这是一个没有.NET框架组件的C#6function。

这完全适用于nameof – 但仅在字符串插值方面有所不同

在大多数情况下,字符串插值将使用string.Format ,但如果您使用的是.NET 4.6,它还可以将插值字符串转换为FormattableString ,如果您想要不变格式,这很有用:

 using System; using System.Globalization; using static System.FormattableString; class Test { static void Main() { CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR"); double d = 0.5; string local = $"{d}"; string invariant = Invariant($"{d}"); Console.WriteLine(local); // 0,5 Console.WriteLine(invariant); // 0.5 } } 

显然,如果$"{d}"只调用了对string.Format的调用,那么这将无法工作……相反,在这种情况下,它会在语句中调用string.Format并分配给local ,并在语句分配中调用FormattableStringFactory.Createinvariant ,并在结果上调用FormattableString.Invariant 。 如果您尝试针对早期版本的框架编译它, FormattableString将不存在,因此它将无法编译。 但是,如果您真的想要,可以提供自己的FormattableStringFormattableStringFactory实现,编译器将适当地使用它们。

这些东西是在C#6中介绍的。 .Net与它无关。 因此,只要您使用C#6编译器 ,就可以使用这些function。

C#和.NET有什么区别?

所以是的, 可以在针对.Net 4.5的项目中使用它们。