5

我正在测试一个示例片段,我发现它是另一个问题的答案

但是编译器吐出这个“运算符 && 不能应用于 long 和 bool 类型的操作数”。为什么这样做?当我阅读代码时,它说“如果掩码和权限大于 0,则返回成功布尔值”

我读错了吗?

(此外,没有人把它称为一个坏例子,所以我希望它能够工作。并不是说我是一个复制粘贴编码器)

bool CheckMask( long Mask, long TestPermission ) {
    return Mask && TestPermission > 0;
}

long mask = 4611686844973976575;

const long MASK_ViewListItems = 0x0000000000000001;
bool HasPermission_ViewListItems = CheckMask(mask, MASK_ViewListItems);
// HasPermission_ViewListItems is true

const long MASK_UseClientIntegration = 0x0000001000000000;
bool HasPermission_UseClientIntegration = CheckMask(mask, MASK_UseClientIntegration);
// HasPermission_UseClientIntegration is false

StackOverflow 上有很多类似的问题,我已经点击了其中的大部分,在我输入的时候右边有一个很大的列表。没有一个适用于我的情况,至少我能够看到答案和我的问题之间的关系。

4

2 回答 2

12

您使用的是&&(条件与,仅对bool操作数有效)而不是&(按位与,对bool操作数或整数操作数有效) -我怀疑您想要后者,并且由于优先规则,您还应该使用括号。我也会更改参数名称以遵循 .NET 命名约定 - 并将其设为静态,因为它不依赖任何状态:

static bool CheckMask(long mask, long testPermission)
{
    return (mask & testPermission) > 0;
}

您可能还想更改为使用枚举而不是long

[Flags]
public enum Permissions
{
    ViewListItems = 1 << 0,
    ...
    UseClientIntegration = 1 << 9
}

static bool CheckMask(Permissions mask, Permissions testPermission)
{
    return (mask & testPermission) != 0;
}
于 2012-06-19T14:44:04.403 回答
3

我猜这就是你想要的:

(Mask & TestPermission) != 0

所以,你需要:

  • 按位&(而不是&&仅适用于布尔)
  • 我猜你想检查是否设置了任何位,包括符号位(!=而不是>)。
于 2012-06-19T14:47:39.863 回答