s_n*_*air 6 c# exception-handling language-design
下面的课有两种方法,其中M1抱怨'并非所有代码路径都返回一个值'而M2则没有.
问题:编译器如何在返回值的上下文中解析M2?如何将NotImplementedException实例隐式转换为int(如果有任何内部编译时间分辨率)
class A
{
int M1()
{
}
int M2()
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
返回值并不总是需要一种方法; 特别是,它也允许通过抛出异常退出(在这种情况下不返回任何值).
编辑:具体来说,返回的方法体的规则int是:
return语句都必须返回一个可转换为的表达式int在您的示例中,编译器可以证明M2始终通过抛出退出,因此无法访问方法块的末尾(满足规则#2).也没有return声明,也满足规则#1.因此,这是一个有效的方法定义.
另一方面,M1不满足规则#2因此不合法.
您可能会被错误消息误导,但该消息根本没有提到投掷,但是考虑到几乎在所有情况下使用返回值的方法return而不是抛出 - 编译器只是告诉您希望您可能忘记这样做.