flags枚举按位运算符未按预期工作

时间:2013-04-17 18:59:04

标签: c#

我在Windows Mobile 6.5上使用C#3.5作为移动应用程序,我一直在使用这个简单的代码,但它突然停止工作:

//Regroup the issues
ScanIssuesEnum NewIssues = 0;
NewIssues |= Direction1Issues;
NewIssues |= Direction2Issues;

//Remove invalid directions because we don't care about them in bidirectionnal mode
NewIssues ^= ScanIssuesEnum.InvalidDirectionIssue;
return NewIssues;

我彻底检查了所有类型,只是为了确保我没有使用其他类型,所有内容都基于相同的ScanIssuesEnum类型,类型为[Flag]'ed,如下所示:

[Flags] public enum ScanIssuesEnum
{
    TicketUsedTooSoonIssue = 1,
    TicketUsedTooLateIssue = 2,
    TicketUsageBustedIssue = 4,
    InvalidTripIssue = 8,
    InvalidDirectionIssue = 16,
    StartStopTooSoonIssue = 32,
    StartStopNotFoundIssue = 64,
    EndStopTooLateIssue = 128,
    EndStopNotFoundIssue = 256,
    MultipleUsageSameTripIssue = 512,
    MultipleUsageInFewHoursIssue = 1024,
    StudentTicketIssue = 2048,
    ConnectingTripWithinTimeframeFlag = 4096,
    UDESStudentTicketIssue = 8192,
}

在我当前的问题中,我可以在DirectionIssues中看到EndStopNotFoundIssue,当合并到NewIssues中时,我得到一个包含两次EndStopNotFoundIssue的值。我认为直到我返回值才真正重要,也许它只是一个可视IDE错误但不是,问题仍然存在。更糟糕的是,当我点击删除InvalidDirectionIssue标志的行时,它将它添加到NewIssues ...

我疯了吗? ^ =相当于x = x ^ y no?所以我应该删除标志,而不是添加它?

由于

编辑#1 - DirectionIssues的值

根据Wonko的要求理智,Direction1Issue和Direction2Issue的值都是EndStopNotFoundIssue或256.

在行“NewIssues ^ = ScanIssuesEnum.InvalidDirectionIssue;”之后我的NewIssues由“EndStopNotFoundIssue | EndStopNotFoundIssue | InvalidDirectionIssue”组成。显然它不应该!

编辑#2 - DirectionIssues错误读取的值

哈,两个DirectionIssues有不同的值,我只是错误地读它们。实际上它是EndStopNotFoundIssue和EndStopTooLateIssue。该死的头脑没有读完整个字嘿嘿。所以OR部分很好,这是我的大脑在欺骗我。

我改变了有关InvalidDirectionIssue的有问题的部分,我正在尝试使用“x = x& ~y”形式进行异或,它可以工作,不知道为什么它可以工作而“x ^ = y”没有但是地狱!找到解决方案!

2 个答案:

答案 0 :(得分:4)

有几件事可能对你有帮助。

  • ^是exclusive-or,因此它会切换/切换您应用的位,但不会清除它们。因此,如果未设置EndStopNotFoundIssue值,则使用^将设置它,而不是清除它。如果要清除值,请使用x &= ~y(AND x和y的反转位)。

  • EndStopNotFoundIssue | EndStopNotFoundIssue等于EndStopNotFoundIssue。将值与自身进行或运算只返回相同的值。所以你没有告诉我们什么。您使用的是+而不是|还是其他什么?您正在进行ORing变量的值是否真的与您认为的一样?您是否单步执行调试器中的代码以查看每个阶段的值是什么?您需要为我们发布更多代码,以便找出出错的地方。

  • 您使用的值似乎不是来自您的枚举(例如0和Direction1Issues)。所以我们无法读取你的代码来解决可能出错的问题,因为我们不知道Direction1Issues的设置是什么。混合不同类型通常是一个坏主意。 0是整数,但您将其设置为枚举类型。定义类似None=0的常量,使代码更具可读性,更安全。

  • 对于常量,请尝试使用下面的样式 - 更容易看到您正在设置哪个位,知道您只设置了一位,并确保在添加时正确计算下一个值新项目:

    public enum ScanIssuesEnum
    {
        TicketUsedTooSoonIssue = 1<<0,
        TicketUsedTooLateIssue = 1<<1,
        TicketUsageBustedIssue = 1<<2,
        InvalidTripIssue       = 1<<3,
        InvalidDirectionIssue  = 1<<4,
        ...
    

答案 1 :(得分:0)

x ^= y相当于x = x ^ y。这意味着它在标志枚举中切换y的状态存在。它可用于设置或取消设置。