Dachte, dies könnte für andere Leute nützlich sein, die hier wie ich gestolpert sind.
Seien Sie vorsichtig, wie Sie mit Aufzählungswerten umgehen, für die Sie möglicherweise den Wert == 0 festgelegt haben (manchmal kann es hilfreich sein, für eine Aufzählung den Status "Unbekannt" oder "Leerlauf" zu verwenden). Es verursacht Probleme, wenn Sie sich auf diese Bitmanipulationsoperationen verlassen.
Auch wenn Sie Aufzählungswerte haben, die Kombinationen aus anderen Potenzen von 2 Werten sind, z
public enum Colour
{
None = 0, // default value
RED = 2,
BLUE = 4,
GREEN = 8,
YELLOW = 16,
Orange = 18 // Combined value of RED and YELLOW
}
In diesen Fällen kann eine solche Erweiterungsmethode nützlich sein:
public static Colour UnSet(this Colour states, Colour state)
{
if ((int)states == 0)
return states;
if (states == state)
return Colour.None;
return states & ~state;
}
Und auch die gleichwertige IsSet-Methode, die die kombinierten Werte behandelt (wenn auch etwas hackig)
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;
}