0

特定のIDのデータベースからレコードを取得しようとしている次のlinqクエリがあります。次に、レコードを調べて、1 バイトのビットが設定されているレコードを見つけようとします。しかし、「演算子 & はバイトまたはブール値に適用できません」というエラーが表示されます。

        Byte firstPacketMask = Convert.ToByte("00001000", 2);

        using (aContext _db = new aContext())
         {
             var query = (from data in _db.Datas
                          where data.id == id 
                          orderby data.ServerTime descending //put the last cycle on top of list
                          select data).ToList();

             var mid = query.Where(x => x.Data[0] & firstPacketMask == 16)
                            .FirstOrDefault();

         }

ここで Data はバイト配列です。Data の最初のバイトにはビット フィールドがあります。ビット 4 が設定されているかどうかを確認しようとしているので、そのパケットを選択します。

4

2 に答える 2

7

&よりも優先順位が低い==ため、コンパイラは式を として解析しますx.Data[0] & (firstPacketMask == 16)

括弧を追加して、優先順位を明確にします。

(x.Data[0] & firstPacketMask) == 16

注:firstPacketMask 8 に等しいように見えるので、これを AND するとx.Data[0]0 または 8 になり、16 にはなりません。

Byte firstPacketMask = Convert.ToByte("00010000", 2);  // bit 4 is set

または多分ただ

(x.Data[0] & 16) == 16
于 2014-04-04T17:15:13.580 に答える
1

あなたが実際に行うことは、firstPacketMask が 16 に等しいかどうかを確認することですが、これは意図したものではないと思います。==演算子は結果として true/false を返し、それがx.Data[0]オブジェクトに対して配置され、エラーが発生します。前述のように、正しい括弧に注意してください。

于 2014-04-04T17:17:20.307 に答える