Rzucanie intów do enums w C #

Jest coś, czego nie mogę zrozumieć w języku C #. Możesz rzucić poza zasięgint wenum a kompilator się nie wzdryga. Wyobraź to sobieenum:

enum Colour
{
    Red = 1,
    Green = 2,
    Blue = 3
}

Teraz, jeśli napiszesz:

Colour eco;
eco = (Colour)17;

Kompilator uważa, że ​​to w porządku. I także czas działania. ?

Dlaczego zespół C # zdecydował się to umożliwić? Ta decyzja pomija punkt, w którym używa się wyrażeń, jak sądzę, w takich scenariuszach:

void DoSomethingWithColour(Colour eco)
{
    //do something to eco.
}

W silnym języku, takim jak C #, chciałbym to założyćeco zawsze będzie mieć legalneColour wartość. Ale tak nie jest. Programista mógł nazwać moją metodę o wartości 17 przypisanej doeco (jak w poprzednim fragmencie kodu), więc kod w mojej metodzie nie może zakładać tegoeco posiada prawneColour wartość. Muszę dokładnie to sprawdzić i poradzić sobie z wyjątkowymi wartościami, tak jak chcę. Dlaczego to?

Moim skromnym zdaniem byłoby o wiele ładniej, gdyby kompilator wydał błąd (lub nawet ostrzeżenie) podczas rzucania poza zasięgiemint wenum, jeśliint wartość jest znana w czasie kompilacji. Jeśli nie, środowisko wykonawcze powinno zgłosić wyjątek w instrukcji przypisania.

Co myślisz? Czy jest jakiś powód, dlaczego tak jest?

(Uwaga. To jest pytanieWysłałem wieki temu na mój blog ale nie otrzymałem odpowiedzi informacyjnej.)

questionAnswers(12)

yourAnswerToTheQuestion