You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于C#顶层语句生成$Program类的条件及SharpLab编译差异的技术咨询

问题解答

1. 顶层语句生成$Program类的条件是什么?

这个行为完全取决于你使用的C#编译器版本:

  • 早期C# 9预览版:在C# 9顶层语句特性的初期开发阶段(比如2020年5月左右的预览版本),编译器会为顶层语句生成一个名为$Program的独立静态类,这个类是隐藏的,无法通过partial关键字扩展。
  • C# 9正式版及后续版本:在C# 9正式发布前,编译器实现被调整为生成partial class Program。这个设计变更的核心目的就是允许开发者通过编写自己的partial class Program来扩展入口类,共享静态成员(比如你示例里的abc字段)。

2. 为何SharpLab会将第一段代码编译为两个类,且无法通过partial class Program扩展入口点类?该特性在发布后是否被修改过?

SharpLab的不同分支对应不同阶段的编译器版本,这是导致差异的核心原因:

  • 你提到的「C# 9: Top-level statements (27 May 2020)」分支用的是C# 9的早期预览编译器,当时还没有引入partial class Program的设计。所以顶层语句会生成独立的$Program(或默认分支的<Program>$)静态类,而你手动写的partial class Program会被当成完全无关的另一个类,两者没有关联,自然无法访问彼此的成员,甚至会出现编译错误。
  • 你本地使用的是.NET 5的后期SDK(5.0.408),这个版本包含了C# 9的正式版编译器,已经实现了partial class Program的设计,所以能正常合并类并访问共享成员。

关于特性修改:是的,这个特性在正式发布前确实被调整过。C#语言团队在开发过程中,把最初设计的static class $Program改成了partial class Program,这个变更不仅体现在编译器实现上,也同步更新了官方文档——从早期描述的$Program类,改为说明顶层语句会生成partial class Program,方便开发者扩展入口逻辑。

内容的提问来源于stack exchange,提问作者gunr2171

火山引擎 最新活动