'nameof' 这个名称在当前上下文中不存在。

37

我正在使用带有 .Net Framework 4.6 的 VS 2013。我想要使用新的 C# 6 特性(例如 nameof),但是我找不到它。

enter image description here

我应该使用VS 2015吗?还是更高版本的.Net Framework?


据我所知,在VS2013中无法使用C# 6。您需要升级到2015。 - user1269016
据我所知,C#语言特性的发布与Visual Studio的发布是相辅相成的,并且不会进行回溯。 - Claies
你仍然可以在Visual Studio 2013中使用.Net Framework 4.6,但是正如你已经回答了自己的问题,你需要Visual Studio 2015才能使用C# 6。 - Auguste
9个回答

42

是的,要使用C# 6功能,您需要一个C# 6编译器。Visual Studio 2013没有C# 6编译器。Visual Studio 2015有。

Visual Studio 2013有Roslyn预发布版,但它们不实现最终的C# 6:它们实际上不实现所有功能,并且它们所实现的与最终的C# 6行为不同。


6
我正在使用VS2015更新2版本,今天刚开始出现这个问题。以前它是可以工作的。编辑:事实证明我的程序中有一个愚蠢的语法错误,导致Visual Studio混淆并认为是因为“nameof在当前上下文中不存在”。--非常奇怪。 - BrainSlugs83
@BrainSlugs83 - 对我来说也是这样。下游语法错误(这也是在静态方法中,不知道是否相关)导致无法识别 nameof()。 - Nick Bauer

6

6

安装此 NuGet 包解决了我的项目问题。

Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform

6

在VS2015之前,你可以将以下类添加到你的解决方案中,并将所有的nameof(替换为NameOf.nameof(() =>,如获取变量或参数的名称所建议。

using System;
using System.Linq.Expressions;

namespace ICSharpCode.SharpZipLib
{
    public class NameOf
    {
        public static String nameof<T>(Expression<Func<T>> name)
        {
            MemberExpression expressionBody = (MemberExpression)name.Body;
            return expressionBody.Member.Name;
        }
    }
}

5
虽然解决方法很糟糕。 - Bauss
11
你可以购买Visual Studio 2015给我使用 :) - ajeh

4

4

在使用DotNetFiddle时,由于我切换到了.NET Core而不是.NET 4.7.X,因此出现了这个错误。


2

如果在Teamcity中出现此错误,请按照以下步骤更改构建步骤以进行纠正。

  1. 在Teamcity中打开您的MSBuild步骤
  2. 将MSBuild版本更改为Microsoft Build Tools 2015
  3. 将MSBuild ToolVersion更改为14.0

0
  1. 在“程序包管理器控制台”中,选择您的相应项目并执行“install-package Microsoft.Net.Compilers”命令。
  2. 确保您的项目设置中的“C#语言级别”为“C# 6.0”。

1
这是Microsoft.Net.Compilers,不是Microsoft.Net.Compiler。(我无法编辑6个字符以下的解决方案) 此外,在安装后,C# 6.0仍然不存在于列表中。 - Ercument Eskar

0
如果您在使用最新的 .Net 并且出现了此错误,可能是因为您正在使用不是 .Net 类型的名称。以下是一个示例:
需要替换硬编码的 "BaseUrl" 的原始代码。
IConfiguration settingsConfig = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
Settings = Options.Create(new Settings
{
  BaseUrl = settingsConfig.GetSection("BaseUrl").Value
});

这会导致错误,因为BaseUrl在上下文中不存在,所以它不起作用:

IConfiguration settingsConfig = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
Settings = Options.Create(new Settings
{
  BaseUrl = settingsConfig.GetSection(nameof(BaseUrl)).Value
});

您需要完全限定或指定一个已存在的 .Net 类型,例如:

Settings = Options.Create(new Settings
{
  BaseUrl = settingsConfig.GetSection(nameof(Settings.BaseUrl)).Value
});

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