Przełącz instrukcję bez wartości domyślnych w przypadku wyliczania

To był mój ulubiony zwierzak, odkąd zacząłem używać .NET, ale byłem ciekawy, czy czegoś mi brakuje. Mój fragment kodu nie zostanie skompilowany (proszę wybaczyć wymuszony charakter próbki), ponieważ (według kompilatora) brakuje instrukcji powrotu:

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";

            }
        }
    }

Teraz wiem, że mogę po prostu umieścić domyślne oświadczenie, aby pozbyć się ostrzeżenia kompilatora, ale moim zdaniem nie tylko ten zbędny kod, jego niebezpieczny kod. Jeśli wyliczenie znajdowało się w innym pliku, a pojawił się inny programista i dodałMoże do mojego wyliczenia byłaby obsługiwana przez moją domyślną klauzulę, która nic nie wieMożes i jest naprawdę duża szansa, że ​​wprowadzimy błąd logiczny.

Gdyby kompilator pozwolił mi użyć mojego kodu powyżej, mógłby wtedy stwierdzić, że mamy problem, ponieważ moja instrukcja przypadku nie obejmowałaby już wszystkich wartości z mojego wyliczenia. Pewnie brzmi dla mnie o wiele bezpieczniej.

Jest to dla mnie tak fundamentalnie błędne, że chcę wiedzieć, czy jest to coś, czego mi brakuje, czy po prostu musimy być bardzo ostrożni, kiedy używamy wyliczeń w instrukcjach przełączników?

EDYTOWAĆ: Wiem, że mogę podnieść wyjątki w ustawieniu domyślnym lub dodać zwrot poza przełącznikiem, ale nadal jest to zasadniczo hack, aby obejść błąd kompilatora, który nie powinien być błędem.

Zważywszy, że enum jest po prostu intem, jest to jeden z najdrobniejszych sekretów .NET, co naprawdę jest bardzo kłopotliwe. Pozwólcie, że zadeklaruję wyliczenie ze skończoną liczbą możliwości, proszę, dajcie mi kompilację dla:

Decision fred = (Decision)123;

a następnie rzucić wyjątek, jeśli ktoś próbuje czegoś takiego:

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

EDYCJA 2:

Kilka osób wypowiedziało się na temat tego, co dzieje się, gdy wyliczenie znajduje się w innym zespole i jak to może spowodować problemy. Chodzi mi o to, że takie zachowanie powinno się wydarzyć. Jeśli zmienię podpis metody, doprowadzi to do problemów, moim założeniem jest, aby zmiana wyliczenia była taka sama. Odnoszę wrażenie, że wiele osób nie uważa, że ​​rozumiem o enums w .NET. Po prostu uważam, że zachowanie jest błędne i miałem nadzieję, że ktoś mógł wiedzieć o jakiejś bardzo niejasnej funkcji, która zmieniłaby moją opinię na temat enums .NET.

questionAnswers(10)

yourAnswerToTheQuestion