一般C#问题

时间:2011-09-13 10:21:40

标签: c# exception-handling language-design

下面的课有两种方法,其中M1抱怨'并非所有代码路径都返回一个值'而M2则没有。

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

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

4 个答案:

答案 0 :(得分:7)

并不总是需要一个方法来返回一个值;特别是,它也允许通过抛出异常退出(在这种情况下不返回任何值)。

修改:具体而言,返回int的{​​{3}}为:

  1. 方法中的所有return语句必须返回可转换为int
  2. 的表达式
  3. 方法块的结尾必须无法访问
  4. 在您的示例中,编译器可以证明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)

MSDN中所述,

  

throw语句用于在程序执行期间发出异常情况(异常)的信号。

当代码执行进入 throw 语句时,程序停止并向用户显示异常消息(如果程序员未指定任何错误处理逻辑)