.NET 專案變更 C# 語言版本

在 Visual Studio 2022 中使用滑鼠右鍵點擊專案 > 屬性,在屬性頁面中找到 建置 > 進階 > 語言版本,在 .NET 6 中預設是使用 C# 10.0

預設框架版本和 C# 語言版本對應如下:
目標 版本 C# 語言版本預設值
.NET 7.x C# 11
.NET 6.x C# 10
.NET 5.x C# 9.0
.NET Core 3.x C# 8.0
.NET Core 2.x C# 7.3
.NET Standard 2.1 C# 8.0
.NET Standard 2.0 C# 7.3
.NET Standard 1.x C# 7.3
.NET Framework all C# 7.3


在新版的 Visual Studio 中已經無法使用介面變更 C# 版本, C# 編譯器會依據目標框架版本自動推斷 C# 語言版本。不過我們還是可以透過修改 .csproj 來修改:
    
<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>net6.0-windows</TargetFramework>
        <Nullable>enable</Nullable>
        <UseWindowsForms>true</UseWindowsForms>
        <ImplicitUsings>enable</ImplicitUsings>
        <LangVersion>11.0</LangVersion>
    </PropertyGroup>

</Project>
    

不過其實這是不合法的,編譯時會出現錯誤:
    
0>CSC: Error CS1617 : /langversion 的選項 '11.0' 無效。請使用 '/langversion:?' 來列出支援的值。
0>------- Finished building project: WinFormsApp1. Succeeded: False. Errors: 1. Warnings: 0
    

在後續的版本中, .NET 5 或以上才支援 C# 9, .NET 6 或以上才支援 C# 10, .NET 7 或以上才支援 C# 11,簡單來說就是可以降版,但是升版就沒有辦法。

其實筆者最想要的就只是 C# 11 的原始字串常值功能,面多有引號的部分可以很方便解決,在寫測試的時候非常方便:
    
string longMessage = """
    This is a long message.
    It has several lines.
        Some are indented
                more than others.
    Some should start at the first column.
    Some have "quoted text" in them.
    """;
    

不過還有方式可以解決這個問題,只要先安裝新版的 .NET SDK ,就可以使用最新的語法
  • preview: 編譯器會接受最新預覽版本的所有有效語言語法
  • latest: 編譯器會接受編譯器最新已發行版本 (包括次要版本) 的語法
  • latestMajor 或 default: 編譯器會接受編譯器最新已發行主要版本的語法
只要改成下面這樣,.NET 6 也可以支援 C# 11 新特性:
    
<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>net6.0-windows</TargetFramework>
        <Nullable>enable</Nullable>
        <UseWindowsForms>true</UseWindowsForms>
        <ImplicitUsings>enable</ImplicitUsings>
        <LangVersion>preview</LangVersion>
    </PropertyGroup>

</Project>
    



參考資料:
Microsoft.Learn - C# language versioning
Microsoft.Learn - What's new in C# 11
Microsoft.Learn - Strings and string literals

留言