Ошибка запроса LINQ: оператор & не может быть применен к байту или bool

У меня есть следующий запрос linq, в котором я пытаюсь получить записи из базы данных для определенного идентификатора. Затем я просматриваю записи и пытаюсь найти ту, в которой установлен бит в один байт. Но я получаю сообщение об ошибке "Оператор & не может быть применен к байту или bool":

        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, тогда я выбираю этот пакет.

2 ответа

Решение

& имеет более низкий приоритет, чем==поэтому компилятор анализирует ваше выражение как x.Data[0] & (firstPacketMask == 16),

Добавьте скобки, чтобы уточнить приоритет:

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

ПРИМЕЧАНИЕ: похоже firstPacketMask равно 8, так что ANDD это x.Data[0] даст 0 или 8, а не 16. Возможно, вы хотели написать

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

или просто

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

Что вы на самом деле делаете, так это проверяете, равен ли firstPacketMask 16, что, на мой взгляд, не соответствует вашим ожиданиям. == оператор возвращает истину / ложь в результате, который затем ставится против x.Data[0] объект, вызывающий ошибку. Как уже упоминалось - позаботьтесь о правильных скобках.

Другие вопросы по тегам