2011-03-02 16 views
6

La siguiente función de la clase Systems.Collections.Generic.Dictionary tiene return statement después de lanzar una excepción, ¿alguien tiene alguna idea de por qué?Declaración de devolución después de lanzar una excepción en C#

public TValue this[TKey key] { 
     get { 
      int i = FindEntry(key); 
      if (i >= 0) return entries[i].value; 
      ThrowHelper.ThrowKeyNotFoundException(); 
      **return default(TValue);** 
     } 
     set { 
      Insert(key, value, false); 
     } 
    } 
+1

Cubierto por Eric Lippert recientemente: http://blogs.msdn.com/b/ericlippert/archive/2011/02/24/never-say-never-part-two.aspx?wa=wsignin1.0 –

Respuesta

7

pesar de que el

ThrowHelper.ThrowKeyNotFoundException(); 

hace Ciertamente lanzar una excepción, el compilador no es lo suficientemente sofisticada como para demostrar que se no hacer nada más. Y como no puede probar que la función nunca regresa, debe suponerse que podría devolver.

Eric Lippert acaba de terminar una miniserie en su blog titulada "Never Say Never" sobre este mismo tema.

http://blogs.msdn.com/b/ericlippert/archive/2011/02/21/never-say-never-part-one.aspx

Resulta que este es un caso simple de la Halting Problem, que se ha demostrado que es indecidible sobre las máquinas de Turing.

+0

Al igual que cuando agrega una declaración de devolución en el bloque try {}, el compilador supone que no hay retorno del método y aumenta los errores de tiempo de compilación. Creo que complier debería ser capaz de descubrir que hay un ayudante de generación (derivado de la excepción de la clase base) y generar los mismos errores de compilación. – Kumar

3

Está forzado a que, dado que el método en sí no está arrojando directamente, el ThrowHelper sí lo está. El compilador no tiene forma de saber esto, así que para satisfacer al compilador se agrega el return default(TValue);, aunque nunca se invocará.

Cuestiones relacionadas