Использование оператора больше/меньше, чем в перечислениях без приведения?

#c# #enums #casting #operator-overloading #comparison-operators

Вопрос:

Я случайно написал

 if (myEnum1 < myEnum2)
{
   //do etc.
}
 

и у меня нет ошибок компилятора.
Не должен ли я сначала отнести эти перечисления к их базовым типам:

 if ((int) myEnum1 < (int) myEnum2))
{
   //do etc.
}
 

Эквивалентны ли эти два фрагмента? Моя ИДЕЯ, наездница на реактивных мозгах, похоже, так не думает. Я не могу перейти к < определениям, поэтому я предполагаю, что это компилятор?

Комментарии:

1. «Мой IDE, гонщик Jetbrains, похоже, так не думает», Что вы имеете в виду?

2. Я просто имею в виду свой интеллект. Что во всех других сценариях, с которыми я сталкивался, уведомляет разработчика, если приведения являются избыточными. Таким образом, это может быть просто достаточно редким случаем, чтобы проскользнуть через IntelliSense, или фрагменты не эквивалентны.

3. Shouldn't I have to cast these enums to their underlying types first Почему ты так думаешь?

4. Вы можете указать свой код класса перечисления?

5. Можете ли вы обычно перейти к определениям встроенных операторов? По крайней мере, я не могу в своей версии Visual Studio для Mac.

Ответ №1:

< , > , <= , >= , == и != все они определены для всех типов перечислений E :

 bool operator ==(E x, E y);
bool operator !=(E x, E y);
bool operator <(E x, E y);
bool operator >(E x, E y);
bool operator <=(E x, E y);
bool operator >=(E x, E y);
 

Это указано в спецификации языка.

Их поведение описывается следующим образом:

Результат вычисления x op y , где x и y являются выражениями типа перечисления E с базовым типом U и op являются одним из операторов сравнения , в точности совпадает с вычислением ((U)x) op ((U)y) . Другими словами, операторы сравнения типов перечисления просто сравнивают базовые интегральные значения двух операндов.

Таким образом, ваши два фрагмента кода будут одинаковыми, если перечисление имеет базовый тип int .

Комментарии:

1. Спасибо, не понял <, >, etc. , что было определено для типов перечислений.