Подтвердить что ты не робот

Enum дополнение к вычитанию и литье

Почему добавление требует отливки, но вычитание работает без литья? Смотрите код ниже, чтобы понять, что я прошу

public enum Stuff
{
    A = 1,
    B = 2,
    C = 3
}

var resultSub = Stuff.A - Stuff.B; // Compiles
var resultAdd = Stuff.A + Stuff.B; // Does not compile
var resultAdd2 = (int)Stuff.A + Stuff.B; // Compiles     

Примечание: для сложения и вычитания не имеет значения, вне зависимости от результата (из перечисления) или нет во всех трех приведенных выше примерах.

4b9b3361

Ответ 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). Другими словами, оператор вычитает значение из базового типа перечисления, получая значение перечисления.

Итак, почему компилятор ведет себя так, потому что это то, что говорит спецификация С#:)

Я не знал, что какой-либо из этих операторов существует, и я никогда не знал, что они используются. Я подозреваю, что причины их существования похоронены где-то на встречах по оформлению дизайна языка, которые иногда погружаются в Эрика Липперта, но я также не удивлюсь, если они будут сожалеть о добавлении функций для небольшой выгоды. Опять же, может быть, они действительно полезны в некоторых ситуациях:)

Ответ 2

Значения по умолчанию для перечислений равны 0,1,2... поэтому в этом случае разница между двумя перечислениями создаст еще одно перечисление (сначала сравните их, чтобы убедиться, что вы вычитаете меньше из большего).

Половина добавления времени создаст слишком высокое значение, чтобы быть допустимым перечислением.

Ответ 3

Проблема заключается в том, что "+" в этом контексте не является плюсом между значениями перечисления. Важно понимать, что + является оператором, и нет правил, определяющих, как применять его к операндам (Stuff.A и St.B.B)