Приведение целых к перечислениям в 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 значение известно во время компиляции. Если нет, среда выполнения должна выдать исключение в операторе присваивания.

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

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

Ответы на вопрос(12)

Ваш ответ на вопрос