?: Условный оператор в 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. Поставьте скобки для более ясного кода.

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