Это всегда беспокоило меня. Возможно, кто-то, обладающий глубокими познаниями в .NET, сможет мне это объяснить.
Предположим, я определил перечисление следующим образом:
public enum Foo
{
Eenie = 1,
Meenie = 2,
Miney = 3,
Moe = 4
}
Теперь также предположим, что где-то в моем коде у меня есть следующий код:
int bar = (Foo)5;
Это скомпилируется просто отлично, и никакое исключение не будет выдано, даже если значение 5 явно не является допустимым значением, определенным в Foo
.
Или рассмотрим следующее:
public void ProcessFoo(Foo theFoo)
{
// Do processing
}
public static void Main()
{
ProcessFoo((Foo)5);
}
Опять не исключение.
На мой взгляд, это должно привести к исключению несоответствия типов, потому что 5 не является Foo
. Но дизайнеры решили не делать этого.
Теперь я написал метод расширения, который может проверить, что это так, и нет ничего сложного в том, чтобы вызвать его, чтобы убедиться, что это так, но я должен использовать отражение, чтобы сделать это (со всей его производительностью штрафы и еще много чего).
Итак, опять же, какая непреодолимая причина, которая могла бы привести к решению не иметь проверенного перечисления?
Для справки, с документация MSDN для класса Enum :
Когда вы определяете метод или свойство
который принимает перечисляемую константу как
значение, рассмотрите возможность проверки значения.
Причина в том, что вы можете сыграть
числовое значение для типа перечисления
даже если это числовое значение не
определено в перечислении.