下面的课有两种方法,其中M1抱怨'并非所有代码路径都返回一个值'而M2则没有。
问题:编译器如何在返回值的上下文中解析M2?如何将NotImplementedException实例隐式转换为int(如果有任何内部编译时解析)
class A
{
int M1()
{
}
int M2()
{
throw new NotImplementedException();
}
}
答案 0 :(得分:7)
并不总是需要一个方法来返回一个值;特别是,它也允许通过抛出异常退出(在这种情况下不返回任何值)。
修改:具体而言,返回int
的{{3}}为:
return
语句必须返回可转换为int
在您的示例中,编译器可以证明M2
总是通过抛出退出,因此无法访问方法块的末尾(满足规则#2)。也没有return
语句,它们也满足规则#1。因此,这是一个有效的方法定义。
另一方面,M1
不符合规则#2,因此不合法。
您可能会被错误消息误导,但根本没有提到投掷,但请注意,在几乎所有情况下,返回值的方法都执行return
而不是抛出 - 编译器只是告诉您希望您可能已经忘记了要做。
答案 1 :(得分:2)
异常会影响代码流。抛出后的任何语句都不会执行,编译器可以证明这一点,因此对通过该方法的路径感到满意。
该异常不会导致返回int
,在正常意义上不会返回任何内容。而是生成异常,CLR处理这些异常。
http://msdn.microsoft.com/en-us/library/ms173160(v=vs.80).aspx
答案 2 :(得分:0)
异常不会被强制转换为int。编译器知道它是一个永远都会达到的异常,因此不会抱怨。当异常被命中时,它会将堆栈展开到异常处理块或崩溃。永远不会将int返回给方法调用者。
答案 3 :(得分:0)