C# 使用字符串插值和nameof in.VS 2015 NET 4.5

C# 使用字符串插值和nameof in.VS 2015 NET 4.5,c#,visual-studio-2015,.net-4.5,.net-4.6,C#,Visual Studio 2015,.net 4.5,.net 4.6,我在代码中使用了类似于$“hello{person}”和nameof(arg1)的东西,但在检查项目属性时,我的目标是.NET4.5 这样行吗?我以为这些东西是在4.6中介绍的 该项目在我的机器上构建并运行正常-但我担心在部署它时会出现问题。这是一个编译器功能,而不是框架功能。我们在Visual Studio 2015的.NET 3.5项目中成功地使用了这两个功能 简而言之,编译器将$“hello{person}”转换为String.Format(“hello{0}”,person)并将name

我在代码中使用了类似于
$“hello{person}”
nameof(arg1)
的东西,但在检查项目属性时,我的目标是.NET4.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\35; 6
中介绍的
.Net
与此无关。因此,只要您使用的是C#6编译器,就可以使用这些功能


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

现有的答案认为这是一个没有.Net framework组件的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
将不存在,因此无法编译。但是,如果您真的愿意,您可以提供自己的
FormattableString
FormattableStringFactory
实现,编译器将适当地使用它们。

请参见Jon Skeet的文章。虽然它没有涵盖C#6.0,但概念是一样的。请参阅我的答案,了解有关
FormattableString
的一些细微之处。