2011-09-13 103 views
6

下面的类有两种方法,其中M1抱怨'不是所有的代码路径都返回一个值',而M2没有。一般C#问题

问题:编译器如何在返回值的上下文中解析M2?如何将NotImplementedException实例隐式转换为int(如果有任何内部编译时间分辨率)

class A 
     { 
      int M1() 
      { 
      } 
      int M2() 
      { 
       throw new NotImplementedException(); 
      } 
     } 
+0

一般Seesharp(致敬) SWeko

+0

我似乎无法找到C#规范中描述此过程的位置,任何人都可以指出这一点? – SWeko

+1

@Sekeko:追踪它。这里:http://msdn.microsoft.com/en-us/library/aa664437(VS.71).aspx(最后一段)。 – Jon

回答

7

的方法并不总是需要返回一个值;尤其是,它也可以通过抛出异常退出(在这种情况下,不返回任何值)。

编辑:具体地说,the rules for the body of a method返回int是:

  1. 在该方法中所有return语句必须返回转换表达式来int
  2. 的方法块的末端必须是不可到达的

在你的例子中,编译器可以证明M2总是通过抛出,所以方法块的结尾是不可达的(满足规则#2)。也没有return陈述,它也满足规则#1。因此这是一个有效的方法定义。

另一方面,M1不符合规则#2,因此它是不合法的。

您可能误导了没有提及抛出的错误消息,但认为在几乎所有情况下,返回值的方法都会执行return而不是抛出 - 编译器只是告诉您希望您可能忘记了。

+0

aw快速为我的WP7键盘。 –

2

异常会影响代码的流向。抛出后的任何语句都不会被执行,编译器可以证明这一点,因此对通过该方法的路径感到满意。

该异常不会导致返回int,在正常意义上不会返回任何东西。相反,生成一个异常,CLR处理这些异常。

http://msdn.microsoft.com/en-us/library/ms173160(v=vs.80).aspx

0

该异常将不会被转换为int。编译器知道这是一个总是会遇到的异常,所以不会抱怨。当异常被触发时,它会将堆栈解压缩到异常处理块或崩溃。一个int永远不会被返回给方法调用者。

0

MSDN所述,

throw语句被用于用信号通知的程序执行过程中异常的情况(异常)的发生。

当代码执行碰上声明,程序停止,显示异常信息给用户(如果程序员没有指定任何错误处理逻辑)