【问题标题】:Using string interpolation and nameof in .VS 2015 NET 4.5在 .VS 2015 NET 4.5 中使用字符串插值和 nameof
【发布时间】:2016-01-18 16:38:25
【问题描述】:

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

这样好吗?我以为这些东西是在 4.6 中引入的。

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

【问题讨论】:

标签: c# visual-studio-2015 .net-4.5 .net-4.6


【解决方案1】:

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

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

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

【讨论】:

  • 在FormattableString 附近查看我的回答,了解这方面的轻微问题。
【解决方案2】:

现有的答案说这是一个没有 .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... 显然这不起作用,在这种情况下,它在分配给local 的语句中调用string.Format,并在语句分配给invariant,并在结果上调用FormattableString.Invariant。如果您尝试针对较早版本的框架进行编译,FormattableString 将不存在,因此无法编译。不过,如果您真的愿意,您可以提供自己的 FormattableString 和 FormattableStringFactory 实现,编译器会适当地使用它们。

【讨论】:

    【解决方案3】:

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

    What is the difference between C# and .NET?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      相关资源
      最近更新 更多