You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:57:09