Ошибка запроса 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]
объект, вызывающий ошибку. Как уже упоминалось - позаботьтесь о правильных скобках.