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

Using string interpolation and nameof in .VS 2015 NET 4.5

我在我的代码中使用了 $"hello {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 开始就受到支持,因此没有什么能阻止您以该框架的早期版本为目标。

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

What is the difference between C# and .NET?

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

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

这完全适用于 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 的调用,这将不起作用...相反,在这种情况下,它在分配给 [=17 的语句中调用 string.Format =],并对结果调用 FormattableStringFactory.Create in the statement assigning to invariant, and calls FormattableString.Invariant。如果您尝试针对框架的早期版本进行编译,FormattableString 将不存在,因此无法编译。不过,如果您真的愿意,可以提供自己的 FormattableStringFormattableStringFactory 实现,编译器会适当地使用它们。