为什么会失败
从根本上讲,它与此相同:
if (someInteger) // C or C++
对比
if (someInteger != 0) // C#
基本上,当涉及到逻辑运算符和条件时,C# 更加严格——它迫使您使用可以bool
转换为bool
.
顺便说一句,这也是为什么在 C# 中这不仅仅是一个警告,而是一个全面的错误:
int x = ...;
if (x = 10) // Whoops - meant to be == but it's actually an assignment
如果您以这种方式看到比较:
if (10 == x)
这通常是开发人员试图避免像上面这样的拼写错误——但在 C# 中不需要它,除非你真的在与常bool
量值进行比较。
解决问题
我怀疑你只需要:
if (((info[i].location & 0x8) != 0)) ||
((info[i].location & 0x100) != 0)) ||
((info[i].location & 0x200) != 0)))
您可能不需要所有这些括号......但另一种选择是只使用一个测试:
if ((info[i].location & 0x308) != 0)
毕竟,您只是在测试是否设置了这三个位中的任何一个...
您还应该考虑使用基于标志的枚举:
[Flags]
public enum LocationTypes
{
Foo = 1 << 3; // The original 0x8
Bar = 1 << 8; // The original 0x100
Baz = 1 << 9; // The original 0x200
}
然后你可以使用:
LocationTypes mask = LocationTypes.Foo | LocationTypes.Bar | LocationTypes.Baz;
if ((info[i].location) & mask != 0)
或使用不受约束的旋律:
LocationTypes mask = LocationTypes.Foo | LocationTypes.Bar | LocationTypes.Baz;
if (info[i].location.HasAny(mask))