Думал, что это может быть полезно для других людей, которые споткнулись здесь, как я.
Будьте осторожны при обработке любых значений перечисления, для которых вы можете установить значение == 0 (иногда может быть полезно иметь состояние Unknown или Idle для перечисления). Это вызывает проблемы при использовании этих операций манипуляции битами.
Также, когда у вас есть перечислимые значения, которые являются комбинациями другой степени 2 значений, например
public enum Colour
{
None = 0, // default value
RED = 2,
BLUE = 4,
GREEN = 8,
YELLOW = 16,
Orange = 18 // Combined value of RED and YELLOW
}
В этих случаях такой метод расширения может пригодиться:
public static Colour UnSet(this Colour states, Colour state)
{
if ((int)states == 0)
return states;
if (states == state)
return Colour.None;
return states & ~state;
}
А также эквивалентный метод IsSet, который обрабатывает объединенные значения (хотя и немного хакерски)
public static bool IsSet(this Colour states, Colour state)
{
// By default if not OR'd
if (states == state)
return true;
// Combined: One or more bits need to be set
if( state == Colour.Orange )
return 0 != (int)(states & state);
// Non-combined: all bits need to be set
return (states & state) == state;
}