按位枚举转换值不是预期的

Raú*_*Roa 1 c# enums bit-manipulation

我有以下枚举:

[Flags]
    public enum PermissionLevel {
        User = 1,
        Administrator = 2,
        ITStaff = 3,
        Manager = 4,
        SuperAdministrator = 6,
    }
Run Code Online (Sandbox Code Playgroud)

当我做:

PermissionLevel permission = (PermissionLevel) dr.GetInt32(i);
Run Code Online (Sandbox Code Playgroud)

我获得分配给权限对象的随机权限值.例如,如果是6,我的权限对象返回"管理员|经理",我应该得到"超级管理员".当我将实例强制转换为整数时,它返回6.

我错过了什么吗?

Fre*_*örk 11

您需要确保每个值组合都是唯一的:

[Flags]
public enum PermissionLevel {
    User = 1,
    Administrator = 2,
    ITStaff = 4,
    Manager = 8,
    SuperAdministrator = 16
}
Run Code Online (Sandbox Code Playgroud)

正如你的枚举目前所看,6可以表示SuperAdministrator或者Administrator | Manager.4可以是ManagerUser | ITStaff等等.

  • 有一种简单的方法可以避免这个问题:不要使用1,2,4,8.使用1 << 1,1-1 << 1,1 << 3,1 << 4,... (3认同)