#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.
, что было определено для типов перечислений.