2011-09-13 32 views
6

La siguiente clase tiene dos métodos en los que M1 se queja de que "no todos los códigos de ruta devuelven un valor" y M2 no.Pregunta general de C#

Pregunta: ¿Cómo resuelve el compilador M2 en el contexto del valor de retorno? Como ejemplo NotImplementedException es fundido implícitamente como int (si hay alguna resolución en el tiempo de compilación interna)

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

general Seesharp (saludos) SWeko

+0

Parece que no puedo encontrar en qué parte de la especificación C# se describe este proceso, ¿alguien puede señalarlo? – SWeko

+1

@SWeko: lo rastreó. Aquí: http://msdn.microsoft.com/en-us/library/aa664437(VS.71).aspx (último párrafo). – Jon

Respuesta

7

Un método no siempre se requiere para devolver un valor; en particular, también se permite salir arrojando una excepción (en cuyo caso no se devuelve ningún valor).

Editar: Específicamente, the rules for the body of a method que devuelve int son:

  1. Todos return declaraciones en el método debe devolver una expresión convertible a int
  2. El extremo del bloque de método no debe ser alcanzable

En su ejemplo, el compilador puede demostrar que M2 siempre sale tirando , por lo que el final del bloque de método no es alcanzable (cumple la regla n. ° 2). Tampoco hay declaraciones return, que también cumple con la regla n. ° 1. Por lo tanto, esta es una definición de método válida.

Por otro lado, M1 no cumple con la regla n. ° 2 por lo que no es legal.

Probablemente se deje engañar por el mensaje de error que no menciona lanzar, pero considere que en casi todos los casos los métodos con valores devueltos hacen return en lugar de arrojar - el compilador simplemente dice que quiere que probablemente se olvidó de hacer.

+0

aw a fast para mi teclado WP7. –

2

excepciones afectan el flujo del código. Cualquier declaración posterior al lanzamiento no se ejecutará, el compilador puede probar esto, por lo que está contento con la ruta a través del método.

La excepción no daría como resultado la devolución de un int, nada se devolverá en el sentido normal. En cambio, se genera una excepción, el CLR maneja esto de manera diferente.

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

0

La excepción no se lanzará como int. El compilador sabe que es una excepción que siempre se alcanzará, por lo que no se queja. Cuando se golpea la excepción, desenrollará la pila a una excepción que maneja bloques o bloqueos. Nunca se devolverá una int al llamador del método.

0

Como se indica en MSDN,

La sentencia throw se utiliza para señalar la ocurrencia de una situación anómala (excepción) durante la ejecución del programa.

Cuando la ejecución de código ejecuta en tiro comunicado, el programa se detiene y se muestra un mensaje de excepción a un usuario (si un programador no especificó ninguna lógica de manejo de errores)