一般C#问题
下面的类有两种方法,其中M1抱怨'不是所有的代码路径都返回一个值',而M2没有。一般C#问题
问题:编译器如何在返回值的上下文中解析M2?如何将NotImplementedException实例隐式转换为int(如果有任何内部编译时间分辨率)
class A
{
int M1()
{
}
int M2()
{
throw new NotImplementedException();
}
}
的方法并不总是需要返回一个值;尤其是,它也可以通过抛出异常退出(在这种情况下,不返回任何值)。
编辑:具体地说,the rules for the body of a method返回int
是:
- 在该方法中所有
return
语句必须返回转换表达式来int
- 的方法块的末端必须是不可到达的
在你的例子中,编译器可以证明M2
总是通过抛出,所以方法块的结尾是不可达的(满足规则#2)。也没有return
陈述,它也满足规则#1。因此这是一个有效的方法定义。
另一方面,M1
不符合规则#2,因此它是不合法的。
您可能误导了没有提及抛出的错误消息,但认为在几乎所有情况下,返回值的方法都会执行return
而不是抛出 - 编译器只是告诉您希望您可能忘记了。
aw快速为我的WP7键盘。 –
异常会影响代码的流向。抛出后的任何语句都不会被执行,编译器可以证明这一点,因此对通过该方法的路径感到满意。
该异常不会导致返回int
,在正常意义上不会返回任何东西。相反,生成一个异常,CLR处理这些异常。
http://msdn.microsoft.com/en-us/library/ms173160(v=vs.80).aspx
该异常将不会被转换为int。编译器知道这是一个总是会遇到的异常,所以不会抱怨。当异常被触发时,它会将堆栈解压缩到异常处理块或崩溃。一个int永远不会被返回给方法调用者。
我似乎无法找到C#规范中描述此过程的位置,任何人都可以指出这一点? – SWeko
@Sekeko:追踪它。这里:http://msdn.microsoft.com/en-us/library/aa664437(VS.71).aspx(最后一段)。 – Jon