【问题标题】:LINQ Query Error: Operator & cannot be applied to byte or boolLINQ 查询错误:运算符 & 不能应用于字节或布尔
【发布时间】:2014-04-04 17:13:18
【问题描述】:

我有以下 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 的第一个字节有位域。我正在尝试检查是否设置了第 4 位,然后我选择了该数据包。

【问题讨论】:

    标签: c# linq and-operator


    【解决方案1】:

    & has lower precedence than ==,因此编译器会将您的表达式解析为x.Data[0] & (firstPacketMask == 16)

    添加括号以明确优先级:

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

    注意:看起来 firstPacketMask 等于 8,因此与 x.Data[0] 进行 AND 运算将得到 0 或 8,而不是 16。也许您打算这样写

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

    或者只是

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

    【讨论】:

      【解决方案2】:

      您实际上要做的是检查 firstPacketMask 是否等于 16,这不是您想要的。 == 运算符作为结果返回 true/false,然后将其放在 x.Data[0] 对象上,从而导致错误。如前所述 - 注意正确的括号。

      【讨论】:

      • 谢谢!是的,这就是问题所在。
      猜你喜欢
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 2014-03-05
      相关资源
      最近更新 更多