Есть кое-что, чего я не могу понять в 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
во время компиляции. Если нет, среда выполнения должна выдать исключение в операторе присваивания.
Что ты думаешь? Есть ли причина, почему это так?
(Примечание. Это вопрос Я много лет назад писал в своем блоге , но не получил информативного ответа.)