Pomyślałem, że może to być przydatne dla innych osób, które potknęły się tutaj, jak ja.
Uważaj, jak radzisz sobie z wartościami wyliczania, które możesz ustawić na wartość == 0 (czasami pomocne może być posiadanie stanu nieznanego lub bezczynności dla wyliczenia). Powoduje to problemy przy korzystaniu z tych operacji manipulacji bitami.
Również gdy masz wartości wyliczane, które są kombinacjami innej potęgi 2 wartości, np
public enum Colour
{
None = 0, // default value
RED = 2,
BLUE = 4,
GREEN = 8,
YELLOW = 16,
Orange = 18 // Combined value of RED and YELLOW
}
W takich przypadkach przydatna może być taka metoda rozszerzenia:
public static Colour UnSet(this Colour states, Colour state)
{
if ((int)states == 0)
return states;
if (states == state)
return Colour.None;
return states & ~state;
}
A także ekwiwalentna metoda IsSet, która obsługuje połączone wartości (choć w nieco pospieszny sposób)
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;
}