5

別の質問の回答として見つけたスニペットの例をテストしています

ただし、コンパイラはこの「演算子 && は long 型および bool 型のオペランドには適用できません」と吐き出しています。なぜこれを行うのですか?コードを読むと、「マスクとパーミッションが 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 には非常に多くの同様の質問があり、それらのほとんどをクリックして確認しました。入力すると、右側に大きなリストが表示されます。私の状況には何も当てはまりませんでした。少なくとも、回答と私の問題との関係を確認できました。

4

2 に答える 2

12

(ビット単位のAND、オペランドまたは整数オペランドに有効)の代わりに&&(条件付き AND、オペランドにのみ有効bool) を使用しています。パラメーター名も .NET 命名規則に従うように変更し、状態に依存しないため静的にします。&bool

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

したがって、次のものが必要です。

  • ビット単位( bool のみに適用される&代わりに)&&
  • そして、符号ビットを含むビットが設定されているかどうかを確認したいと思います(そう!=ではなく>)。
于 2012-06-19T14:47:39.863 に答える