Поправьте меня, если я ошибаюсь (потому что мог бы быть), но когда вы выполняете проверки флагов Enum, .NET по существу выполняет двоичную арифметику с целым числом, которое представляет сумму флагов.
То есть значение SecurityRoles.Administrator | SecurityRoles.BackOffice | SecurityRoles.Consultant
- это то же самое, что значение 26 или 11010
в двоичном виде.
Когда вы вызываете Enum.HasFlags, выполняется операция return thisInstance & flag == flag
Таким образом, если вы проверяете ранее упомянутый флаг, установленный для требуемых ролей SecurityRoles.Executive | SecurityRoles.BackOffice
, значение 3 или 11
в двоичном формате, математика выглядит примерно так:
11010 - 26 Administrator | BackOffice | Consultant
00011 - 3 Executive | BackOffice
-----
00010 - 2 BackOffice which really doesn't mean anything useful
Тогда из этого следует, что 26 & 3 == 3
ложно.
И ради тщательности, учитывая SecurityRoles.Executive | SecurityRoles.Administrator | SecurityRoles.BackOffice | SecurityRoles.Consultant
значение 27 или 11011
в двоичном виде, математика выглядит так:
11011 - 26 Executive | Administrator | BackOffice | Consultant
00011 - 3 Executive | BackOffice
-----
00011 - 3 Executive | BackOffice
Тогда из этого следует, что 26 & 3 == 3
истинно.
Метод расширения, похожий на этот, может быть полезным (не проверено)
public static bool HasFlags(this Enum source, Enum[] flags)
{
return flags.Any(f => source.HasFlag(f));
}