Kupikir ini mungkin berguna untuk orang lain yang tersandung di sini seperti aku.
Berhati-hatilah bagaimana Anda menangani nilai enum apa pun yang mungkin Anda tetapkan untuk memiliki nilai == 0 (kadang-kadang bisa bermanfaat untuk memiliki keadaan Tidak Dikenal atau Menganggur untuk enum). Ini menyebabkan masalah ketika mengandalkan operasi manipulasi bit ini.
Juga ketika Anda memiliki nilai enum yang merupakan kombinasi dari kekuatan lain dari 2 nilai, misalnya
public enum Colour
{
None = 0, // default value
RED = 2,
BLUE = 4,
GREEN = 8,
YELLOW = 16,
Orange = 18 // Combined value of RED and YELLOW
}
Dalam kasus ini, metode ekstensi seperti ini mungkin berguna:
public static Colour UnSet(this Colour states, Colour state)
{
if ((int)states == 0)
return states;
if (states == state)
return Colour.None;
return states & ~state;
}
Dan juga metode IsSet ekuivalen yang menangani nilai-nilai gabungan (meskipun sedikit cara hacky)
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;
}