为何返回值为void的C# Main方法运行后退出码为0?
问题解答
本质是你把两个不同层级的规则搞混了:C#语法里void代表方法无返回值,是C#语言层面对方法签名的约定;而进程退出码是操作系统层面对所有可执行程序的强制要求,二者没有绑定关系。
- 不管用什么编程语言写程序,只要是在操作系统上运行的可执行文件,进程终止时必须给操作系统回传一个整数状态码:通用约定是
0代表程序正常执行结束,非0值代表异常或自定义执行状态,根本不存在“不返回退出码的进程”。 - C#编译器针对两种Main签名做了不同的编译适配,不会因为你写了
void Main()就让进程不返回退出码:- 当你写
static int Main()签名时,编译器会直接把你在方法里return的整数值,作为进程退出码传递给操作系统,所以你返回5时,命令行就会显示退出码5。 - 当你写
static void Main()签名时,编译器会自动在生成的底层执行逻辑里补上默认值:等你写的Main方法内所有代码正常执行完毕后,自动把退出码0传给操作系统。你看到的0根本不是void Main方法自己返回的,是编译器自动追加的默认行为。
- 当你写
你可以自己做个小测试:用
static void Main()签名,在方法里加一行Environment.Exit(99);,运行结束后就会看到进程退出码是99,和Main方法的void返回类型没有任何冲突——Main方法的返回值只是编译器设置进程退出码的其中一个入口,不是唯一入口。
内容的提问来源于stack exchange,提问作者Erik_JI
相关产品推荐
相关产品推荐

