示例代码:为什么编译器认为Environment.Exit可以返回?
switch(something)
{
case 0:
System.Environment.Exit(0);
case 1:
// blah ...
break;
}
它不能编译,因为编译器认为该执行可以从出口返回()。编译器显然是错误的。
没有窍门。 System.Environment.Exit()
是真正的。
不仅对于System.Environment.Exit()
返回是完全不合逻辑的,我追溯了代码,最终调用了ExitProcess(exitCode);
,它不能返回。
由于编译器无法查看方法的IL以知道在运行时将执行什么(因为编译器绝对没有办法知道在运行时将装载什么精确的程序集),您将如何*建议编译器知道给定的方法不会返回? –
@AlexeiLevenkov:鉴于目前的情况,[System.Runtime.InteropServices.NoReturn] void Exit(int ExitCode);如果我重新写这个,会有一个类似于System.Void的类型,意味着无法访问。 – Joshua
属性不是方法签名的一部分 - 所以它不起作用,因为编译器不能保证在运行时加载库来实现该方法甚至会拥有该属性(忽略编译器和JIT必须强制执行的事实莫名其妙)。事实上,返回特殊类型是方法签名的一部分,但它是否值得构建整个额外基础结构,以验证该方法无法返回此方法终止进程的特殊情况? –