我在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”没有但是地狱!找到解决方案!
答案 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的状态存在。它可用于设置或取消设置。