为何本地运行C#代码时出现CS8803和CS0106错误?
问题原因及解决方法
错误原因
你遇到的两个错误都是因为本地项目使用了.NET 6+默认的「顶级语句」模板,而教程中的代码是基于传统控制台项目结构编写的:
- CS8803:顶级语句模式下,所有执行逻辑代码(比如变量声明、控制台输出)必须放在类型/命名空间声明的前面,你把
record类型声明放在了Main方法之前,违反了这个规则。 - CS0106:在顶级语句的文件中,直接定义的类型不能使用
public修饰符——因为顶级语句会被编译器自动包裹在一个隐式生成的Program类中,直接定义的类型属于文件作用域,不允许添加公共访问修饰符。
微软在线运行环境会自动适配代码结构,比如默认使用传统项目模板(显式Main方法+命名空间),所以代码能正常运行。
解决方法
有两种方案可选,按需选择即可:
方案一:适配顶级语句模式(推荐,符合.NET 6+默认风格)
去掉显式的Main方法,把执行逻辑放在最前面,record类型声明移到后面,同时移除public修饰符:
// 执行逻辑放在最前面(顶级语句) var pt = new Point(1, 1); var pt2 = pt with { Y = 10 }; Console.WriteLine($"The two points are {pt} and {pt2}"); // 类型声明放在顶级语句之后,无需public修饰符 record Point(int X, int Y);
方案二:改用传统项目结构
将代码放在命名空间和显式的Program类中,这样可以保留public修饰符和Main方法:
namespace TestProject; public record Point(int X, int Y); class Program { public static void Main() { Point pt = new Point(1, 1); var pt2 = pt with { Y = 10 }; Console.WriteLine($"The two points are {pt} and {pt2}"); } }
修改后执行dotnet build即可正常编译运行。
内容的提问来源于stack exchange,提问作者Mohamed
相关产品推荐
相关产品推荐

