0

我有以下 linq 查询,我试图从数据库中获取特定 ID 的记录。然后我浏览记录并尝试找到设置了一个字节中的位的记录。但我收到“运算符 & 不能应用于字节或布尔”的错误:

        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,这不是你想要的。==运算符作为结果返回真/假,然后将其放在x.Data[0]对象上,从而导致错误。如前所述 - 注意正确的括号。

于 2014-04-04T17:17:20.307 回答