Имя nameof не существует в текущем контексте

Я использую VS 2013 с.Net Framework 4.6. Я хочу использовать новые функции C# 6 (например, nameof).Но я не смог его найти.

Должен ли я использовать VS 2015? Или выше.Net Framework?

9 ответов

Решение

Да, чтобы использовать возможности C# 6, вам нужен компилятор C# 6. Visual Studio 2013 не имеет компилятора C# 6. Visual Studio 2015 делает.

Были предварительные выпуски Roslyn для Visual Studio 2013, но они не реализуют окончательный C# 6: они фактически не реализуют все функции, и то, что они делают, отличается от окончательного поведения C# 6.

В pre-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;
        }
    }
}

Да, вам нужно использовать Visual Studio 2015. Он не поддерживается в VS 2013. Ссылка по ссылке: https://msdn.microsoft.com/en-us/library/dn986596.aspx

Установка этого пакета исправила его для моего проекта.

Пакет установки Microsoft.CodeDom.Providers.DotNetCompilerPlatform

Вы не сможете использовать C#6 в VS2013. Компилятор не поймет новый синтаксис C#6, который вы пытаетесь использовать. Как я могу добавить C# 6.0 в Visual Studio 2013?

Я получил эту ошибку при использовании DotNetFiddle, я просто перешел на .NET Core вместо .NET 4.7.X.

Если вы получаете эту ошибку в Teamcity, внесите следующие изменения, чтобы исправить ее.

  1. Откройте свой шаг MSBuild в команде
  2. Измените версию MSBuild на Microsoft Build Tools 2015
  3. Измените MSBuild ToolVersion на 14.0

Если вы получаете эту ошибку и используете последнюю версию .Net, это может быть связано с тем, что вы используете имя чего-то, что не является типом .Net. Вот пример:

Оригинал с необходимостью замены HardCoded «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
});
  1. В "Консоли диспетчера пакетов" выполните "install-package Microsoft.Net.Compilers", выбрав соответствующий проект.
  2. Убедитесь, что "C# Language Level" - это "C# 6.0" в настройках вашего проекта.
Другие вопросы по тегам