使用Flags枚举时按位或未追加值,仅保留最后值的问题求助
问题分析与解决
你的问题核心在于Flags枚举成员的值设置不符合规则。Flags特性要求每个枚举成员必须是2的幂次(1、2、4、8、16……),这样每个成员在二进制中对应独立的一位,才能通过按位或(|)实现多值组合。
看你的代码:
[Flags] public enum Categ { None = 0, Doors = 1, // 二进制 0001 Views = 2, // 二进制 0010 Rooms = 3, // 二进制 0011 → 此处错误,该值已包含Doors的位 Spaces = 4 // 二进制 0100 }
Rooms = 3对应的二进制是0011,这其实已经覆盖了Doors(0001)的位。所以当你执行Categ.Doors | Categ.Rooms时,本质是0001 | 0011 = 0011,结果还是Rooms,看起来像是没有追加值。
正确的枚举定义
把Rooms的值改成2的幂次,确保每个成员对应唯一的二进制位:
[Flags] public enum Categ { None = 0, Doors = 1, // 2^0 = 1 → 0001 Views = 2, // 2^1 = 2 → 0010 Spaces = 4, // 2^2 = 4 → 0100 Rooms = 8 // 2^3 = 8 → 1000 }
验证组合效果
现在执行var category = Categ.Doors | Categ.Rooms;,结果会是Doors | Rooms,你可以用HasFlag方法判断是否包含某个成员:
bool hasDoors = category.HasFlag(Categ.Doors); // 返回true bool hasRooms = category.HasFlag(Categ.Rooms); // 返回true
直接输出category的字符串也会显示Doors, Rooms,完全符合多值组合的预期。
内容的提问来源于stack exchange,提问作者Paslet87
相关产品推荐
相关产品推荐

