2

无论如何,这是我的问题,我一直在修改整个 C++ 程序以在 C# 中工作,我已经完成了,我在 C++ 程序中有这个 If 语句。

if(info[i].location & 0x8 || 
             info[i].location & 0x100|| 
                     info[i].location & 0x200)
{
    //do work
}
else
{
    return
}

当然,当我在 C# 中执行此操作时,它会给我一个“运算符 '||' 不能应用于“int”和“int”类型的操作数”错误。

关于我的问题的任何线索,我猜测 C# 有办法做到这一点,因为我对这些旧的 C 运算符相当不熟悉。

4

2 回答 2

10

为什么会失败

从根本上讲,它与此相同:

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))
于 2012-08-02T21:04:07.827 回答
4

这几乎就是它所说的:在 C# 中,||是一个纯逻辑运算符,因此不能在int. 您可以替换||| (按位或在 上起作用ints),但随后需要通过将整个表达式与零进行比较来将其转换为布尔值,因为在 C# 中if- 语句需要布尔值。

或者,您可以替换info[i].location & 0x8(info[i].location & 0x8 != 0).

于 2012-08-02T21:04:56.257 回答