【问题标题】:The name 'nameof' does not exist in the current context当前上下文中不存在名称“nameof”
【发布时间】:2016-01-01 19:32:12
【问题描述】:

我将 VS 2013 与 .Net Framework 4.6 一起使用。我想使用新的 C# 6 功能(例如nameof)。但我找不到。

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

【问题讨论】:

  • 据我所知,您不能在 VS2013 中使用 C# 6。您需要升级到 2015
  • afaik,C# 语言功能版本与 Visual Studio 版本齐头并进,不会向后移植。
  • 您应该仍然可以在 Visual Studio 2013 中使用 .Net Framework 4.6,但正如您已经回答了自己的问题,您需要 Visual Studio 2015 才能使用 C# 6。

标签: c# visual-studio visual-studio-2013


【解决方案1】:

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

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

【讨论】:

  • 我正在使用 VS2015,更新 2,我今天才开始看到这个问题。它曾经工作过。编辑:原来我的程序中有一个愚蠢的语法错误,Visual Studio 感到困惑并决定这是因为nameof doesn't exist in the current context。 -- 很奇怪。
  • @BrainSlugs83 - 我也是。下游语法错误(这也在静态方法中,想知道这是否相关)导致 nameof() 无法识别。
【解决方案2】:

是的,您需要使用 Visual Studio 2015。VS 2013 不支持它。相关链接:https://msdn.microsoft.com/en-us/library/dn986596.aspx

【讨论】:

    【解决方案3】:

    在 VS2015 之前的版本中,您可以将以下类添加到您的解决方案中,并按照 get name of a variable or parameter 中的建议将 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;
            }
        }
    }
    

    【讨论】:

    • 虽然解决方案很糟糕。
    • 或者你可以买我VS 2015 :)
    【解决方案4】:

    安装这个 nuget 包为我的项目修复了它。

    Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
    

    【讨论】:

      【解决方案5】:

      您将无法在 VS2013 中使用 C#6。编译器将无法理解您尝试使用的新 C# 6 语法。 How can I add C# 6.0 to Visual Studio 2013?

      【讨论】:

        【解决方案6】:

        如果您在 Teamcity 中遇到此错误,请进行以下更改以构建步骤来纠正它。

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

        【讨论】:

          【解决方案7】:

          我在使用 DotNetFiddle 时遇到此错误,我刚刚切换到 .NET Core 而不是 .NET 4.7.X。

          【讨论】:

            【解决方案8】:
            1. 在“包管理器控制台”中执行“install-package Microsoft.Net.Compilers”并选择您的相应项目。
            2. 确保项目设置中的“C# 语言级别”为“C# 6.0”。

            【讨论】:

            • 它是 Microsoft.Net.Compilers。不是 Microsoft.Net.Compiler。 (我无法编辑低于 6 个字符的解决方案)另外,安装后 C# 6.0 仍然不存在于列表中。
            【解决方案9】:

            如果您收到此错误并且使用的是最新的 .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
            });
            

            【讨论】:

              猜你喜欢
              • 2020-03-10
              • 2013-10-02
              • 2014-04-22
              • 2017-06-17
              • 2015-09-11
              • 1970-01-01
              • 1970-01-01
              • 2022-12-18
              相关资源
              最近更新 更多