Cambiar la instrucción sin valor predeterminado cuando se trata de enumeraciones

Este ha sido un motivo favorito para mí desde que empecé a usar .NET, pero tenía curiosidad por si me faltaba algo. Mi fragmento de código no se compilará (perdone la naturaleza forzada de la muestra) porque (de acuerdo con el compilador) falta una declaración de devolución:

public enum Decision { Yes, No}

    public class Test
    {
        public string GetDecision(Decision decision)
        {
            switch (decision)
            {
                case Decision.Yes:
                    return "Yes, that's my decision";
                case Decision.No:
                    return "No, that's my decision";

            }
        }
    }

Ahora sé que simplemente puedo colocar una declaración por defecto para deshacerme de la advertencia de que cumple con los requisitos, pero en mi opinión no solo es ese código redundante, su código peligroso. Si la enumeración estaba en otro archivo y otro desarrollador aparece y agregaTal vez a mi enumeración sería manejada por mi cláusula por defecto que no sabe nada sobreTal vezs y hay una muy buena posibilidad de que estemos introduciendo un error lógico.

Mientras que, si el compilador me permite usar mi código anterior, podría identificar que tenemos un problema, ya que la declaración de mi caso ya no cubrirá todos los valores de mi enumeración. Claro suena mucho más seguro para mí.

Esto es tan fundamental para mí que quiero saber si es solo algo que me falta, o ¿debemos ser muy cuidadosos cuando usamos las enumeraciones en las declaraciones de cambio?

EDITAR: Sé que puedo generar excepciones en el valor predeterminado o agregar una devolución fuera del conmutador, pero esto sigue siendo fundamentalmente piratear para evitar un error de compilación que no debería ser un error.

Con respecto a una enumeración realmente solo es un int, ese es uno de los pequeños secretos sucios de .NET que es bastante vergonzoso. Permítame declarar una enumeración con un número finito de posibilidades, por favor, y dame una compilación para:

Decision fred = (Decision)123;

y luego lanzar una excepción si alguien intenta algo como:

int foo = 123;
Decision fred = (Decision)foo;

EDIT 2:

Algunas personas han hecho comentarios sobre lo que sucede cuando la enumeración se encuentra en un ensamblaje diferente y cómo esto podría generar problemas. Mi punto es que este es el comportamiento que creo que debería ocurrir. Si cambio una firma de método, esto dará lugar a problemas, mi premisa es que cambiar una enumeración debería ser lo mismo. Me da la impresión de que mucha gente no cree que entienda sobre las enumeraciones en .NET. Simplemente creo que el comportamiento es incorrecto, y esperaba que alguien pudiera conocer alguna característica muy oscura que hubiera alterado mi opinión sobre las enumeraciones de .NET.

Respuestas a la pregunta(10)

Su respuesta a la pregunta