1

我在 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] 的,如下所示:

[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 不是吗?所以我应该删除标志,而不是添加它吗?

谢谢

编辑 #1 - DirectionIssues 的值

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

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

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

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

我更改了关于 InvalidDirectionIssue 的有问题的部分,我试图使用“x = x & ~y”形式进行异或运算,并且它有效,不知道为什么它有效,而“x ^= y”却没有,但地狱!找到解决方案!

4

2 回答 2

4

有几件事可能会对您有所帮助。

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

  • EndStopNotFoundIssue | EndStopNotFoundIssue等于EndStopNotFoundIssue。将一个值与自身进行 ORing 只会返回相同的值。所以你没有告诉我们什么。您使用的是 a+而不是 an|或其他东西吗?您正在 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,
        ...
    
于 2013-04-17T19:14:29.763 回答
0

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

于 2013-04-17T19:03:34.150 回答