我在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-方向值的值

按照Wonko的要求,Direction1Issue和Direction2Issue的值均为EndStopNotFoundIssue或256。

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

编辑#2-方向值读取错误

哈,两个DirectionIssues具有不同的值,我只是错误地读取了它们。实际上是EndStopNotFoundIssue和EndStopTooLateIssue。该死的念头没有读完整个词,呵呵。因此,OR部分很好,这是我的大脑在欺骗我。

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

最佳答案

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


^是异或运算符,因此它会切换/切换您应用的位,但不会清除它们。因此,如果未设置EndStopNotFoundIssue值,则使用^将对其进行设置,而不是将其清除。如果要清除值,请使用x &= ~y(AND x和y的反位)。
EndStopNotFoundIssue | EndStopNotFoundIssue等于EndStopNotFoundIssue。将值与自身进行“或”运算将返回相同的值。所以你没有告诉我们一些事情。您使用的是+而不是|之类的东西吗?您要进行“或”运算的变量的值真的是您认为的吗?您是否单步调试程序中的代码以查看每个阶段的值?您需要发布更多代码,以便我们找出错误之处。
您使用的值似乎不是来自您的枚举的(例如0和Direction1Issues)。因此,由于我们不知道Direction1Issues设置了什么,因此我们无法阅读您的代码来找出可能出了什么问题。混合使用不同类型通常是个坏主意。 0是整数,但是您将其设置为枚举类型。定义一个像None=0这样的常量,以使您的代码更具可读性和类型安全性。
对于常量,请尝试使用下面的样式-可以很容易地看到要设置的位,知道只设置了一位,并确保添加新项时正确计算出下一个值:

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

10-05 18:05