Использование функций C# 7 внутри View в проекте ASP.NET MVC Core

Я искал другие вопросы, связанные с этим, но ни один, кажется, не совсем то, что я ищу.

У меня есть сайт, работающий на ASP.NET Core с новой структурой проекта в VS2017. Файлы кода, использующие функции C#7, компилируются нормально. Но попытка использовать эти функции в представлении приводит к ряду ошибок о синтаксисе. Я попытался установить Roslyn, чтобы использовать его при компиляции представлений, поскольку, насколько я могу судить, функции C#7 доступны в пакете Roslyn nuget 2.x и выше. Но теперь я получаю отзыв, который явно говорит

Ошибка CS8059: функция "объявление переменных" недоступна в C# 6. Пожалуйста, используйте языковую версию 7 или выше.

В прошлом я проверял web.config, но в проекте ASP.NET Core нет web.config, кроме почти пустого в корне для обработки запроса из IIS.

Как мне указать, что мои представления должны быть скомпилированы с Roslyn, так как это не делается до времени выполнения? По крайней мере, я предполагаю, что это решит мою проблему на этом этапе.

Изменить: этот вопрос не является дубликатом этого, как я уже упоминал в начале, я также искал существующие вопросы. Это специально включает функции C#7 в вашем приложении во время компиляции и только для приложения ASP.NET. Я использую ASP.NET Core, в котором нет файла web.config, в котором определены какие-либо параметры компиляции. Кроме того, что я пытаюсь сделать это для представлений, которые компилируются во время выполнения и могут быть в другой системе.

Решение:

Для тех, кто заинтересован, Вы должны добавить Roslyn в свой проект (который я знал), но вы также должны настроить RazorViewEngineOptions использовать CSharpParseOptions которые указывают версию языка (по умолчанию 6). Я сделал это, но я не сделал это правильно. Мне нужно было назначить результат WithLanguageVersion() обратно над ParseOptions заменить их.

services.AddMvc().AddRazorOptions(options => options.ParseOptions = options.ParseOptions.WithLanguageVersion(LanguageVersion.CSharp7));

2 ответа

Решение

Не могли бы вы попробовать следующее (рекомендовано людьми из основной группы ASP.NET):

  1. Установите пакеты Microsoft.CodeAnalysis.CSharp (версия 2.0.0) и System.ValueTuple (версия 4.3.0).
  2. В файле Startup.cs в методе ConfigureServices настройте Razor для использования C# 7, выполнив следующие действия:

    services.AddMvc().AddRazorOptions(options =>
         options.ParseOptions = new CSharpParseOptions(LanguageVersion.CSharp7));
    

Итак, я обнаружил, что есть некоторые параметры компиляции, которые вы вызываете вызов в ConfigureServices() вызов.

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc().AddRazorOptions(x => x.ParseOptions.WithLanguageVersion(LanguageVersion.CSharp7));
}

Проблема в LanguageVersion.CSharp7 выдает ошибку, если вы не добавите Roslyn. Поэтому я предполагаю, что это необходимо.

После добавления Roslyn все компилируется нормально, НО все равно выдает ошибку.

@{
    //My view code
    string s = "1";
    int.TryParse(s, out int i);
}

Поэтому, если MVC предоставляет RazorOptions, которые можно использовать для указания языковой версии, почему это не соблюдается?

Другие вопросы по тегам