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

Pet*_*eGO 7 c# .net-4.5 visual-studio-2015 .net-4.6

我使用的东西一样$"hello {person}",并nameof(arg1)在我的代码,但检查项目属性我针对.NET 4.5.

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

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

Hei*_*nzi 14

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

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

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


Jon*_*eet 11

现有的答案谈到这是一个没有.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
    }    
}
Run Code Online (Sandbox Code Playgroud)

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