我在代码中使用了像$"你好 {person}"
和nameof(arg1)
这样的语句,但是在检查项目属性时发现我正在针对.NET 4.5进行开发。
这样可以吗?我以为这些语法是在4.6中引入的。
尽管该项目在我的计算机上构建和运行正常,但我担心在部署时会出现问题。
我在代码中使用了像$"你好 {person}"
和nameof(arg1)
这样的语句,但是在检查项目属性时发现我正在针对.NET 4.5进行开发。
这样可以吗?我以为这些语法是在4.6中引入的。
尽管该项目在我的计算机上构建和运行正常,但我担心在部署时会出现问题。
这是一个编译器的特性,不是框架的特性。我们在Visual Studio 2015中使用.NET 3.5项目时都成功地使用了这两个特性。
简而言之,编译器将$"hello {person}"
翻译为 String.Format("hello {0}", person)
,并将nameof(arg1)
翻译为"arg1"
。它只是一种语法糖。
运行时看到一个String.Format
调用(或一个字符串字面量“arg1”),并不知道(也不关心)原始源代码的样子。String.Format
自.NET Framework早期就支持,因此没有任何阻止您针对较早版本的框架进行目标定位的东西。
FormattableString
有一点小问题。 - Jon Skeetnameof
- 但只是有点适用于字符串插值。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
,那么这是行不通的……相反,在这种情况下,它在赋值给local
的语句中调用了string.Format
,并在赋值给invariant
的语句中调用了FormattableStringFactory.Create
,并在结果上调用了FormattableString.Invariant
。如果你尝试在较早版本的框架中编译这个代码,FormattableString
将不存在,因此无法编译。如果你真的想要,你可以提供自己的FormattableString
和FormattableStringFactory
实现,编译器会适当地使用它们。