วิธีใช้คุณลักษณะ c # 8.0 ใหม่ในมุมมองมีดโกน


14

ฉันได้อัปเดตแอปพลิเคชันเว็บ ASP.NET Mvc 5 ของฉันเพื่อใช้คุณสมบัติ c # 8.0 ใหม่ผ่าน Visual Studio 2019 และทุกอย่างทำงานได้ดีจนกระทั่งฉันพยายามใช้คุณลักษณะใหม่เหล่านี้ภายในมุมมองมีดโกน

ตัวอย่างเช่นหากฉันพยายามใช้นิพจน์สวิตช์ใหม่:

@{
    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 ในมุมมองมีดโกนหรือไม่?


จะช่วยได้ไหม - stackoverflow.com/questions/31689374/...
ผ้าม่าน

ดีนั่นคือสิ่งที่ฉันพบว่ามันอาจจะเกี่ยวข้องกับMicrosoft.CodeDom.Providers.DotNetCompilerPlatformแพคเกจ แต่ฉันไม่สามารถทำงานได้สำหรับ c # 8.0 อย่างใด
dbraillon

ทำงานได้สำหรับฉัน - ฉันอัปเดตการอ้างอิงถึง Microsoft.CodeDom.Providers.DotNetCompilerPlatform ไปเป็นเวอร์ชัน # 2.0.1 (ติดตั้งแพคเกจ Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version 2.0.1)
yob

ฉันเพิ่งลองครั้งใหม่ด้วยโซลูชันใหม่: สร้างโซลูชันใหม่ด้วยแม่แบบ 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 ของฉัน ฉันยังสามารถใช้คุณสมบัติที่เป็นโมฆะ และรหัสที่แนะนำโดยคอมไพล์ OP และทำงานได้ดี ดังนั้นจึงเป็นเรื่องที่น่าสนใจว่าทำไมสิ่งนี้ถึงใช้งานไม่ได้กับแอปพลิเคชัน ASP.NET
โทมัส Heijtink

@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 และรับข้อเสนอแนะด้วยความหวังที่จะรวมมันเป็นหลัก)
ห้องโถง

มีใครพยายามแยกหรือไม่? ฉันไม่เห็นสิ่งใดใน 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ดังนั้นวิธีเดียวที่จะอัปเดตแพ็กเกจนั้นเพื่ออนุญาตให้ใช้คุณสมบัติใหม่บางอย่าง

ฉันจะอัปเดตคำตอบนั้นทันทีที่ฉันได้รับข้อมูลเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.