在.NET 2.0中使用C#新特性
2024-03-17 17:33:41

我们有时有这样的需求:在.NET Framework 2.0中用上较新的C#特性,以提高开发效率及幸福感。
现代C#的某些特性需要框架支持,而微软官方已经放弃对.NET Framework 2.0的支持,某些特性甚至完全不支持.NET Framework。
为了在.NET Framework 2.0中使用上新特性,可以使用第三方库。

改变语言版本

在开始介绍之前,我们最好将语言版本改至最高。
默认情况下,.NET Framework使用 C# 7.3 版本。为了用上最新的语言特性,我们编辑工程文件.csproj,添加<LangVersion>属性

1
2
3
4
5
6
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
...
<LangVersion>latest</LangVersion>
</PropertyGroup>
</Project>

latest意味着使用编译器支持的最高语言版本

若要了解当前使用的语言版本,请在代码中添加 #error version(区分大小写)。 这样做可使编译器报告编译器错误 CS8304,并显示一条消息,其中包含正在使用的编译器版本和当前选择的语言版本。


.NET Framework 3.5 特性

无参数Action委托

介绍:
https://docs.microsoft.com/zh-cn/dotnet/api/system.action?view=netframework-3.5

解决方案1:Theraot.Core
解决方案2:NetLegacySupport.Action

扩展方法

介绍:
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

解决方案1:Theraot.Core
解决方案2:DevLib.Legacy


.NET Framework 4.0 特性

Tuple类

介绍:
https://docs.microsoft.com/zh-cn/dotnet/api/system.tuple?view=netframework-4.0

解决方案1:Theraot.Core
解决方案2:NetLegacySupport.Tuple

ThreadLocal

介绍:
https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadlocal-1

解决方案1:Theraot.Core


.NET Framework 4.7 特性

ValueTuple 结构

介绍:
https://docs.microsoft.com/zh-cn/dotnet/api/system.valuetuple?view=netframework-4.7
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/builtin-types/value-tuples

解决方案1:Theraot.Core
解决方案2:Portable.System.ValueTuple


不支持 .NET Framework 的特性

Range 结构

介绍:
https://docs.microsoft.com/zh-cn/dotnet/api/system.range

解决方案1:Theraot.Core

Index 结构

介绍:
https://docs.microsoft.com/zh-cn/dotnet/api/system.index

解决方案1:Theraot.Core

仅初始化属性(Init-only properties)

介绍:
https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-9#init-only-setters
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/init

解决方案1:Theraot.Core
解决方案2:IsExternalInit


参考

C# 语言版本控制