Как использовать новые функции c # 8.0 в представлениях Razor

14

Я обновил свое веб-приложение ASP.NET Mvc 5 для использования новых функций c # 8.0 через Visual Studio 2019, и все работает нормально, пока я не попытаюсь использовать эти новые функции в представлении Razor.

Например, если я попытаюсь использовать новое выражение переключателя:

@{
    ViewBag.Title = "About";

    var foo = 1;
    var bar = foo switch
    {
        1 => "one",
        2 => "two",
        _ => string.Empty
    };
}
<h2>@ViewBag.Title.</h2>
<h3>@ViewBag.Message</h3>

<p>Use this area to provide additional information.</p>

Компилятор не будет жаловаться, пока я не попытаюсь добраться до страницы, сообщив мне об ошибке компиляции.

Ошибка компиляции

Я подозреваю, что это Microsoft.CodeDom.Providers.DotNetCompilerPlatformдолжно быть обновлено, но кажется, что нет доступных обновлений.

Есть ли способ использовать функции языка c # 8.0 в представлениях Razor?

dbraillon
источник
это поможет? - stackoverflow.com/questions/31689374/...
хулиган
хорошо, именно здесь я обнаружил, что это, вероятно, связано с Microsoft.CodeDom.Providers.DotNetCompilerPlatformпакетом, но я не могу заставить его работать как-то для c # 8.0
dbraillon
Работы для меня, - я обновил ссылку на Microsoft.CodeDom.Providers.DotNetCompilerPlatform до версии 2.0.1 # (Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 2.0.1)
хулиган
Я только что попробовал другой раз с новым решением: создать новое решение с шаблоном mvc по умолчанию с .Net Framework, написать некоторый код c # 8.0, Visual Studio спросить, хочу ли я обновить свой проект для использования c # 8.0, принять его, а затем написать очень тот же код для представления. Он компилируется, но не
запускается
Удачи в этом вопросе?
eaglei22

Ответы:

6

.net Framework поддерживает C # 7.3, поэтому вы не можете заставить работать Razor View

.net core 3 поддерживает C # 8, и я смог заставить ваш пример работать с приложением .net Core 3 MVC.

Вы можете посмотреть здесь: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version

Я надеюсь, что выше помогает :)

Рики Стам
источник
Хотя то, что вы говорите, правда. Я могу использовать функции C # 8.0 в моем проекте .net 4.7.2, просто изменив его LangVersionв моем csproj. Я даже могу использовать функцию Nullable. И предложенный код OP компилируется и работает просто отлично. Поэтому интересно, почему это не будет работать для приложения ASP.NET.
Томас Хейтинк
@ThomasHeijtink, см. Последнее обновление для Microsoft.CodeDom.Providers.DotNetCompilerPlatform было год назад - 13.09.2018. Таким образом, теперь возможности C # 8 не поддерживаются с помощью встроенного компилятора.
гал
1
@ThomasHeijtink, вы могли бы внести свой вклад в хранилище . Я считаю , что вам просто нужно использовать последнюю версию Microsoft.Net.Compilers в RoslynCodeProvider.settings.targets : <MSNetCompilersNuGetPackageLatestVersion>3.3.1</MSNetCompilersNuGetPackageLatestVersion>. Вы можете создать свой собственный пакет nuget из источников и использовать его (или сделать PR и получить обратную связь с надеждами объединить его в master).
гал
Кто-нибудь пробовал вилку? Я не вижу одного на GitHub (который добавляет это изменение). Моя цель состоит в том, чтобы постепенно перевести проект ASP.NET Classic в ядро, и некоторый код, застрявший на 7.x, вредит этому.
Сёрен Куклау
2

Итак, есть некоторые вещи, которые необходимо уточнить в первую очередь.

Согласно этому ответу версия языка C # связана с платформой, а C # 8.0 полностью доступен для всех языков, поддерживающих .Net Standard 2.1. .NET Framework 4.7.2 и ниже не поддерживает .NET Standard 2.1, и это не будет иметь место в будущем.

Тем временем есть способ использовать C # 8.0, если вы указали LangVersion в любом файле проекта .csproj:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net48</TargetFrameworks>
    <LangVersion>8.0</LangVersion>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

Это активирует C # 8.0, и вам будут доступны некоторые не связанные функции фреймворка. Проверьте ссылку ответ, чтобы узнать, какой.

Наконец, чтобы ответить на мой собственный вопрос, в настоящее время нет способа использовать какие-либо функции C # 8.0 в представлении Razor. Компиляция во время выполнения, похоже, выполняется с использованием названного пакета, Microsoft.CodeDom.Providers.DotNetCompilerPlatformпоэтому единственный способ - обновить этот пакет, чтобы позволить использовать некоторые новые функции.

Я обновлю этот ответ, как только получу больше информации.

dbraillon
источник