在使用 .NET 4.5 和 Visual Studio 2015 中,如何使用字符串插值和 nameof?

8

我在代码中使用了像$"你好 {person}"nameof(arg1)这样的语句,但是在检查项目属性时发现我正在针对.NET 4.5进行开发。

这样可以吗?我以为这些语法是在4.6中引入的。

尽管该项目在我的计算机上构建和运行正常,但我担心在部署时会出现问题。


请参阅Jon Skeet的[解开版本问题](http://csharpindepth.com/Articles/Chapter1/Versions.aspx)。虽然它不涵盖C#6.0,但概念是相同的。 - Habib
3个回答

14

这是一个编译器的特性,不是框架的特性。我们在Visual Studio 2015中使用.NET 3.5项目时都成功地使用了这两个特性。

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

运行时看到一个String.Format调用(或一个字符串字面量“arg1”),并不知道(也不关心)原始源代码的样子。String.Format自.NET Framework早期就支持,因此没有任何阻止您针对较早版本的框架进行目标定位的东西。


1
请看我的答案,关于FormattableString有一点小问题。 - Jon Skeet

11
现有答案谈到这是C# 6的一个特性,没有.NET框架组件。
这完全适用于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,那么这是行不通的……相反,在这种情况下,它在赋值给local的语句中调用了string.Format,并在赋值给invariant的语句中调用了FormattableStringFactory.Create,并在结果上调用了FormattableString.Invariant。如果你尝试在较早版本的框架中编译这个代码,FormattableString将不存在,因此无法编译。如果你真的想要,你可以提供自己的FormattableStringFormattableStringFactory实现,编译器会适当地使用它们。


1
这些功能是在C#6中引入的。与此无关的是.Net。只要您使用C#6编译器,就可以使用这些功能。 C#和.NET有什么区别? 因此,针对.Net 4.5的项目中使用它们是可以的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接