.NET 4.7.2项目中目标类型对象创建语法为何表现不一致?
.NET 4.7.2项目设置
<LangVersion>default时支持C#9语法的原因 问题背景
使用传统构造语法StringBuilder myString = new StringBuilder();时,所有.NET 4.7.2项目均可正常运行;但使用C#9的目标类型对象创建语法StringBuilder myString = new();时:
- .NET 4.7.2的Web项目正常运行
- 同版本的类库项目报错,提示该特性需C#9及以上版本支持
查看项目构建设置,两者均显示“基于框架版本自动选择语言版本”(对应C#7.3),但编辑csproj文件发现:
- Web项目的
<LangVersion>为default - 类库项目原先是
7.3,改为default后即可正常使用new()语法
疑问:为何.NET 4.7.2项目在default语言版本下能支持C#9的语法?
原因解析
1. <LangVersion>default的实际含义
default并非绑定.NET框架对应的C#版本,而是使用当前开发环境中安装的最新.NET SDK所支持的最高兼容C#版本。只要该C#语法特性不依赖更高版本.NET框架的核心API,就能在旧框架项目中正常编译运行。
2. 目标类型对象创建语法的特性本质
C#9的new()目标类型创建属于纯语法糖,编译器会在编译阶段将其转换为和new 具体类型()完全等价的IL代码,不需要依赖.NET 5+及以上版本的类库API。因此即使在.NET 4.7.2这种旧框架上,只要编译器支持该语法,就能正常运行。
3. 不同项目模板的默认语言版本差异
旧版.NET Framework类库项目模板默认会将<LangVersion>锁定为框架对应的C#版本(比如.NET4.7.2对应C#7.3),而Web项目模板默认使用default设置,让SDK自动选择当前支持的最高兼容C#版本,这就是两者表现不同的核心原因。
内容的提问来源于stack exchange,提问作者BLoB
相关产品推荐
相关产品推荐

