Jon es, por supuesto, todo correcto que una enumeración puede tener cualquier valor de su subyacente tipo, y por lo tanto el cambio no es exhaustivo, y por lo tanto hay una ruta de código que no regresa. Sin embargo,, no es un análisis completo del problema. Incluso si fuera el caso de que el interruptor fuera exhaustivo, aún así obtendría el error.
Inténtelo:
int M(bool b)
{
switch(b)
{
case true : return 123;
case false: return 456;
}
}
O
int M(byte b)
{
switch(b)
{
case 0: case 1: case 2: ... all of them ... case 255: return 123;
}
}
En ambos casos se obtendrá el mismo "punto final alcanzable en el método no-vacío" de error.
Esto es simplemente un descuido en la sección "comprobación de alcanzabilidad" de la especificación C#. Definimos el punto final de una instrucción switch como alcanzable si no tiene una sección predeterminada, punto. No hay dispensa especial para los interruptores que consumen de forma exhaustiva todos los valores posibles de su entrada. Es un caso de esquina que los diseñadores de idiomas se perdieron, y nunca ha sido una prioridad lo suficientemente alta como para solucionarlo.
Para otros tres hechos interesantes sobre el análisis de los estados de conmutación, véase:
http://ericlippert.com/2009/08/13/four-switch-oddities/
Dado que el método es privada y por lo tanto la persona que llama debe estar pasando solamente cosas buenas (porque el autor de la persona que llama es * te *, no a sus usuarios) Sugeriría un Debug.Fail ("¡Mala persona que llama! ¡Sin galletas!") o similar en el caso predeterminado. –
@Eric: Posiblemente ...excepto que aún necesita devolver algo o lanzar una excepción * también * para cumplir con los requisitos de accesibilidad. Personalmente, nunca he sido muy fanático de 'Debug. *' - Tiendo a gustarme ver las mismas excepciones en el modo de lanzamiento que en el modo de depuración, pero puede que solo sea yo. –