Як використовувати нові функції 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?



ну саме там я виявив, що це, мабуть, пов’язано з 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, візуальна студія запитати, чи хочу я оновити мій проект на використання c # 8.0, прийняти його, а потім написати це дуже той самий код для представлення. Він компілює, але не виконуватиметься під час виконання ...
dbraillon

Будь-яка удача в цьому питанні?
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. Я навіть можу використовувати функцію нульового зменшення. І запропонований кодом ОП компілюється і працює просто чудово. Тож цікаво, чому це не працює для програми ASP.NET.
Thomas Heijtink

@ThomasHeijtink, дивіться останнє оновлення для Microsoft.CodeDom.Providers.DotNetCompilerPlatform було рік тому - 13.09.2018. Отже, зараз функції C # 8 не підтримуються компільованим пакетом.
гал

1
@ThomasHeijtink, ви можете внести свій внесок у сховище . Я вважаю , що вам просто потрібно використовувати останню версію Microsoft.Net.Compilers в RoslynCodeProvider.settings.targets : <MSNetCompilersNuGetPackageLatestVersion>3.3.1</MSNetCompilersNuGetPackageLatestVersion>. Ви можете створити свій власний пакунок від джерел і використовувати його (або зробити PR та отримати зворотній зв'язок із надією злити його в головний).
гал

Хтось спробував виделку? Я не бачу його в GitHub (що додає цю зміну). Моя мета полягає в поступовому переході проекту ASP.NET Classic до основної, і якийсь код застряг на 7.x вид, що шкодить цьому.
Sören Kuklau

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 всередині подання Бритви. Здається, компіляція часу виконання виконується з пакетом з назвою, Microsoft.CodeDom.Providers.DotNetCompilerPlatformтому єдиним способом було б оновлення цього пакета, щоб дозволити використовувати деякі нові функції.

Я оновлю цю відповідь, як тільки отримаю більше інформації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.