嘿伙计们,所以我环顾四周,似乎无法找到答案,我猜我正在寻找所有错误的条款。
无论如何这里是我的问题我一直在修改整个C ++程序在C#中工作而且我已经完成了,我在C ++程序中有这个If语句
if(info[i].location & 0x8 ||
info[i].location & 0x100||
info[i].location & 0x200)
{
//do work
}
else
{
return
}
当然,当我在C#中执行此操作时,它会给我一个“操作员'||'不能应用于'int'和'int'类型的操作数“error
关于我的问题是什么的任何线索,我猜测C#有一种方法可以做到这一点,因为我对这些旧的C运算符相当不熟悉
非常感谢
答案 0 :(得分:10)
为何失败
从根本上说,它与此相同:
if (someInteger) // C or C++
VS
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)
那些通常开发人员试图像上面那样避免拼写错误 - 但除非你真的与常量bool
值进行比较,否则C#中不需要它。< / p>
解决问题
我怀疑你只需要:
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))
答案 1 :(得分:4)
它几乎就是它所说的:在C#中,||
是一个仅逻辑运算符,因此无法在int
上运行。您可以将||
替换为|
(按位或对ints
起作用),但是通过将整个表达式与零进行比较,需要将整个表达式转换为布尔值,因为在C#中if
- 语句需要布尔值。
或者,您可以将info[i].location & 0x8
替换为(info[i].location & 0x8 != 0)
。