?: Условный оператор в LINQ не работает должным образом
У меня проблемы с одним из моих запросов LINQ, поэтому я сделал его упрощенную версию в LINQPad, чтобы помочь мне. Проблема в том, что я не понимаю, почему он все еще не делает то, что, как мне кажется, должно...
var list = "1 2 3 4".Split();
var result = list.FirstOrDefault(x =>
x == "3"
&& true);
result.Dump();
Это возвращает 3
так же, как можно было бы предположить.
Тем не менее, когда я запускаю это:
var list = "1 2 3 4".Split();
var result = list.FirstOrDefault(x =>
x == "3"
&& false ? false : true);
я получил 1
назад. Последняя строка - это упрощение реального кода. Оба примера должны дать true
на последней строке, которая будет возвращать 3
, но запрос с условным оператором бросает туда излом.
Что мне не хватает?
4 ответа
Ваше тестовое выражение ассоциируется так:
(x == "3" && false) ? false : true
вместо этого:
x == "3" && (false ? false : true)
То, что вы видите, связано с приоритетом оператора. Исправление для вас будет заключаться в том, чтобы обернуть условие в паренов:
x == "3" && (false ? false : true)
&& имеет более высокий приоритет, чем?:
Это считается (x == "3" && false) ? false : true
вот почему у вас странное поведение.
Я подозреваю, что ваша лямбда оценивается в (x == 3 && false) ? false : true
который вернет первый элемент, потому что условие всегда будет иметь значение false. Поставьте скобки для более ясного кода.