Ответ 1
Хороший вопрос - я был удивлен, что работала первая и третья линии.
Тем не менее, они поддерживаются в спецификации языка С# - в разделе 7.8.4 речь идет о добавлении перечисления:
Каждый тип перечисления неявно предоставляет следующие предопределенные операторы, где E - тип перечисления, а U - основной тип E:
E operator +(E x, U y) E operator +(U x, E y)
Во время выполнения эти операторы оцениваются точно так же, как (E) ((U) x + (U) y)
И в разделе 7.8.5:
Каждый тип перечисления неявно предоставляет следующий предопределенный оператор, где E - тип перечисления, а U - основной тип E:
U operator -(E x, E y)
Этот оператор оценивается точно как
(U)((U)x - (U)y))
. Другими словами, оператор вычисляет разницу между порядковыми значениямиx
иy
, а тип результата является базовым типом перечисления.E operator -(E x, U y);
Этот оператор оценивается точно как
(E)((U)x - y)
. Другими словами, оператор вычитает значение из базового типа перечисления, получая значение перечисления.
Итак, почему компилятор ведет себя так, потому что это то, что говорит спецификация С#:)
Я не знал, что какой-либо из этих операторов существует, и я никогда не знал, что они используются. Я подозреваю, что причины их существования похоронены где-то на встречах по оформлению дизайна языка, которые иногда погружаются в Эрика Липперта, но я также не удивлюсь, если они будут сожалеть о добавлении функций для небольшой выгоды. Опять же, может быть, они действительно полезны в некоторых ситуациях:)