В конструкторе if ((x & y) == y)...
есть что-то слишком многословное, особенно если x
AND y
являются составными наборами флагов, и вы только хотите знать, есть ли какое-либо перекрытие.
In этот случай, все, что вам действительно нужно знать, - если после битмаскирования есть ненулевое значение [1].
[1] См. комментарий Хайме. Если бы мы были достоверно bitmasking , нам нужно было бы только проверить, что результат положительный. Но поскольку
blockquote>enum
s может быть отрицательным, даже, как ни странно, в сочетании с атрибутом[Flags]
, он защищен кодом для!= 0
, а не> 0
.Создание настроек @ andnil ...
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace BitFlagPlay { class Program { [Flags] public enum MyColor { Yellow = 0x01, Green = 0x02, Red = 0x04, Blue = 0x08 } static void Main(string[] args) { var myColor = MyColor.Yellow | MyColor.Blue; var acceptableColors = MyColor.Yellow | MyColor.Red; Console.WriteLine((myColor & MyColor.Blue) != 0); // True Console.WriteLine((myColor & MyColor.Red) != 0); // False Console.WriteLine((myColor & acceptableColors) != 0); // True // ... though only Yellow is shared. Console.WriteLine((myColor & MyColor.Green) != 0); // Wait a minute... ;^D Console.Read(); } } }