Когда вы делаете |
, вы выбираете оба. Когда вы делаете &
, вы только то, что перекрывается.
Обратите внимание, что эти операторы имеют смысл, только когда вы применяете атрибут [Flags]
к своему перечислению. См. http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx для полного объяснения этого атрибута.
В качестве примера приведем следующее перечисление:
[Flags]
public enum TestEnum
{
Value1 = 1,
Value2 = 2,
Value1And2 = Value1 | Value2
}
И несколько тестовых случаев:
var testValue = TestEnum.Value1;
Здесь мы проверяем, что testValue
перекрывается с Value1And2
(т.е. является частью):
if ((testValue & TestEnum.Value1And2) != 0)
Console.WriteLine("testValue is part of Value1And2");
Здесь мы проверяем, точно ли testValue
равно Value1And2
. Это, конечно, не так:
if (testValue == TestEnum.Value1And2)
Console.WriteLine("testValue is equal to Value1And2"); // Will not display!
Здесь мы проверяем, точно ли комбинация testValue
и Value2
равна Value1And2
:
if ((testValue | TestEnum.Value2) == TestEnum.Value1And2)
Console.WriteLine("testValue | Value2 is equal to Value1And2");