我们有时有这样的需求:在.NET Framework 2.0中用上较新的C#特性,以提高开发效率及幸福感。
现代C#的某些特性需要框架支持,而微软官方已经放弃对.NET Framework 2.0的支持,某些特性甚至完全不支持.NET Framework。
为了在.NET Framework 2.0中使用上新特性,可以使用第三方库。
改变语言版本
在开始介绍之前,我们最好将语言版本改至最高。
默认情况下,.NET Framework使用 C# 7.3 版本。为了用上最新的语言特性,我们编辑工程文件.csproj
,添加<LangVersion>
属性
1 | <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
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
扩展方法
解决方案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