我一直试图在C#中模仿我在C ++中实现没有任何问题的行为。我有一个基于2的幂的标志集合,以及我需要检查它是否存在于集合中的标志。
byte flagCollection = 1 | 2 | 4 | 8;
byte flag = 2;
if ((flagCollection & flag) != 0) MessageBox.Show("y"); else MessageBox.Show("n");
现在,问题在于无论我将Flag设置为(2,3,100,211),我总是得到“y”,除了0。当然,1,2,4,8会是一些常数在我的申请中有不同的含义。
在C ++中:
if (flagCollection & flag)
上述变量的结果为TRUE。
答案 0 :(得分:2)
你这样做的方式似乎是正确的。我不确定你期待的是什么行为。您列出的任何标志(2,3,100,211)都包含1 |的元素2 | 4 | 8.如果你想检查所有是否存在,你应该做
if ((flagCollection & flag) == flag)
// ...
答案 1 :(得分:1)
好吧,如果你的旗帜收集已经OR了1,2,4,8,呃是的我认为每个正整数不是16的倍数,而且它会返回一些东西。或者我错过了什么?
答案 2 :(得分:0)
这会有用吗?
[Flag]
public enum flagCollection {
Type1,
Type2,
Type4,
Type8,
}
flagCollection testValue = flagCollection.Type2
if ((testValue & flagCollection.Type2) == flagCollection.Type2) {
MessageBox.Show("y");
} else {
MessageBox.Show("n");
}
不在编译器的前面,如果那样可行,那就不行了。