Cara menggunakan fitur c # 8.0 baru dalam tampilan Razor

14

Saya telah memperbarui aplikasi web ASP.NET Mvc 5 saya untuk menggunakan fitur c # 8.0 baru melalui Visual Studio 2019 dan semuanya berfungsi dengan baik sampai saya mencoba menggunakan fitur-fitur baru ini di dalam tampilan Razor.

Misalnya, jika saya mencoba menggunakan ekspresi sakelar baru:

@{
    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>

Kompiler tidak akan mengeluh sampai saya mencoba menjangkau halaman, memberi saya kesalahan kompilasi.

Kesalahan kompilasi

Saya curiga Microsoft.CodeDom.Providers.DotNetCompilerPlatform harus diperbarui tetapi tampaknya tidak ada pembaruan yang tersedia.

Apakah ada cara untuk menggunakan fitur bahasa c # 8.0 dalam tampilan Razor?

dbraillon
sumber
akankah ini membantu? - stackoverflow.com/questions/31689374/…
yob
baik, di situlah saya menemukan bahwa itu mungkin terkait dengan Microsoft.CodeDom.Providers.DotNetCompilerPlatformpaket tetapi saya tidak bisa membuatnya bekerja untuk c # 8.0 entah bagaimana
dbraillon
berfungsi untuk saya, - Saya memperbarui referensi ke Microsoft.CodeDom.Providers.DotNetCompilerPlatform ke versi # 2.0.1 (Instal-Paket Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 2.0.1)
yob
Saya baru saja mencoba waktu lain dengan solusi baru: membuat solusi baru dengan template mvc default dengan .Net Framework, menulis beberapa kode c # 8.0, visual studio bertanya apakah saya ingin memperbarui proyek saya untuk menggunakan c # 8.0, menerimanya lalu menulis itu dengan sangat kode yang sama dengan tampilan. Itu mengkompilasi tetapi tidak akan mengeksekusi saat runtime ...
dbraillon
Keberuntungan dalam masalah ini?
eaglei22

Jawaban:

6

Kerangka kerja bersih mendukung C # 7.3 itu sebabnya Anda tidak dapat membuat Tampilan Razor Anda berfungsi

.net core 3 mendukung C # 8 dan saya dapat membuat contoh Anda berfungsi dengan aplikasi .net Core 3 MVC.

Anda dapat melihatnya di sini: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version

Saya harap bantuan di atas :)

Ricky Stam
sumber
Sementara apa yang Anda katakan itu benar. Saya saya dapat menggunakan C # 8,0 fitur dalam proyek Net 4.7.2 saya dengan hanya mengubah LangVersiondalam csproj saya. Saya bahkan dapat menggunakan fitur nullable. Dan kode yang disarankan oleh OP mengkompilasi dan berjalan dengan baik. Jadi, menarik mengapa ini tidak bekerja untuk aplikasi ASP.NET.
Thomas Heijtink
@ThomasHeijtink, lihat pembaruan terakhir untuk Microsoft.CodeDom.Providers.DotNetCompilerPlatform adalah tahun lalu - 13.09.2018. Jadi, sekarang fitur C # 8 tidak didukung dengan kompiler yang dibundel.
Hal
1
@ThomasHeijtink, Anda bisa berkontribusi ke repositori . Saya percaya Anda hanya perlu menggunakan versi terakhir dari Microsoft.Net.Compilers di RoslynCodeProvider.settings.targets : <MSNetCompilersNuGetPackageLatestVersion>3.3.1</MSNetCompilersNuGetPackageLatestVersion>. Anda dapat membangun paket nuget Anda sendiri dari sumber dan menggunakannya (atau membuat PR dan mendapatkan umpan balik dengan harapan untuk menggabungkannya menjadi master).
Hal
Adakah yang pernah mencoba garpu? Saya tidak melihat satu di GitHub (yang menambahkan perubahan ini). Tujuan saya adalah untuk secara bertahap mentransisikan proyek ASP.NET Classic ke inti, dan memiliki beberapa kode yang macet pada 7.x jenis itu menyakitkan.
Sören Kuklau
2

OK jadi, ada beberapa hal yang perlu diklarifikasi terlebih dahulu.

Menurut jawaban ini versi bahasa C # terkait dengan kerangka kerja, dan C # 8.0 sepenuhnya tersedia untuk semua bahasa yang mendukung .Net Standard 2.1. .NET Framework 4.7.2 dan di bawah ini tidak mendukung .NET Standard 2.1 dan tidak akan menjadi kasus di masa depan.

Sementara itu ada cara untuk menggunakan C # 8.0 jika Anda menentukan LangVersion dalam file proyek .csproj:

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

Ini akan mengaktifkan C # 8.0 dan beberapa fitur kerangka kerja tanpa ikatan akan tersedia untuk Anda. Periksa tautan jawaban untuk mengetahui yang mana.

Akhirnya untuk menjawab pertanyaan saya sendiri, saat ini, tidak, tidak ada cara untuk menggunakan salah satu fitur C # 8.0 di dalam tampilan Razor. Kompilasi run-time tampaknya dilakukan dengan paket bernamaMicrosoft.CodeDom.Providers.DotNetCompilerPlatform sehingga satu-satunya cara adalah memperbarui paket itu untuk memungkinkan beberapa fitur baru digunakan.

Saya akan memperbarui jawaban itu segera setelah saya mendapatkan informasi lebih lanjut.

dbraillon
sumber