Приведение целых к перечислениям в C #

Есть кое-что, чего я не могу понять в C #. Вы можете разыграть вне диапазонаint вenum и компилятор не дрогнет. Представь себеenum:

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

Теперь, если вы напишите:

Colour eco;
eco = (Colour)17;

Компилятор считает, что это нормально. И время выполнения тоже. Э-э?

Почему команда C # решила сделать это возможным? Я считаю, что в этом решении не стоит использовать перечисления в таких сценариях:

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

В языке со строгой типизацией, таком как C #, я хотел бы предположить, чтоeco всегда будет иметь законныйColour стоимость. Но это не так. Программист может вызвать мой метод со значением 17, присвоеннымeco (как в предыдущем фрагменте кода), поэтому код в моем методе не должен предполагать, чтоeco имеет законныйColour стоимость. Мне нужно проверить это явно и обработать исключительные значения, как мне угодно. Почему это?

По моему скромному мнению, было бы намного лучше, если бы компилятор выдавал сообщение об ошибке (или даже предупреждение) при приведении вне диапазонаint вenumеслиint значение известно во время компиляции. Если нет, среда выполнения должна выдать исключение в операторе присваивания.

Как вы думаете? Есть ли причина, почему это так?

(Примечание. Это вопросЯ опубликовал много лет назад в своем блоге но не получил информативного ответа.)