运营商&&无法应用

时间:2012-06-19 14:42:23

标签: c# .net

我正在测试我在another Question

上找到答案的示例代码段

然而,编译器正在吐出这个“运算符&&&&&&&>”。 为什么这样做?当我阅读代码时,它会说“如果掩码和权限大于0则返回成功bool”

我读错了吗?

(另外,没有人把它称为一个糟糕的例子,所以我希望它可以工作。不是我是一个复制粘贴编码器)

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上有很多类似的问题,我点击了大部分内容,在我输入的时候,我的右边有一个很大的列表。没有适用于我的情况,至少我能够看到答案和我的问题之间的关系。

2 个答案:

答案 0 :(得分:12)

您正在使用&& (conditional AND, only valid for bool operands)而不是& (bitwise AND, valid for bool operands or integer operands) - 我怀疑您想要后者,并且您还应该使用括号,因为优先规则。我也将参数名称更改为遵循.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;
}

答案 1 :(得分:3)

我猜这就是你想要的:

(Mask & TestPermission) != 0

所以,你需要:

  • 按位&(而非仅适用于布尔的&&
  • 我猜你想检查是否设置了包含符号位的位(所以!=代替>)。