轉:在.NET FX 4.8項目中使用C# 8/9/10的新語法

在.NET FX 4.8項目中使用C# 8/9/10的新語法

 

受到某些特殊原因的限制,有時候.NET項目被鎖死在.NET Framework 4.8,而無法升級到.NET 5等更高版本,導致代碼中能夠使用的C#語法最高只能支持到C# 7.3,而無法使用C# 8及更高版本的語法。

C# 8及更高版本引入了不少很有實用價值的新語法,能否在.NET版本被限制在4.8的情況下使用這些新語法特性呢?答案是:可以部分實現。

C# 8及更高版本的C#所引入的新語法,大體上可以分爲兩大類:需要.NET運行時支持的與不需要.NET運行時支持的。

對於前一種情況,在.NET版本沒有升級的情況下,很顯然是無法在老版本項目中使用的;但對於第二種情況,則是有可能實現的。

實現方法:在solution文件(*.sln)所在目錄下,新建一個名爲“Directory.Build.props”文件,文件內容爲

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <LangVersion>latest</LangVersion>
  </PropertyGroup>
</Project>

這樣就可以在.NET Framework 4.8項目中使用C# 8/9/10所引入的新語法了(但僅限於不需要新運行時支持的語法特性)。比如,可以使用:

  • using declaration
  • Static local functions
  • switch match pattern expression
  • Target-typed new expressions
  • lambda expression type inference
  • File Scoped Namespaces

其他一些語法也能夠支持,但可能需要額外補充一些.NET 4.8缺失的類型,比如:

  • Init only setters
  • Index and Range

github上有個PolySharp項目,通過Source Generator自動補充新版本語法所需要的額外類型,我試了下,對於一般的C#項目是可用的,但對於包含WPF XAML代碼文件的項目,編譯時會報錯,原因未知。此時,只能自行手動補充確實的類型的定義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章