Linq где с троичными и скобками

У меня есть следующий запрос:

return Postcodes
            .Where(
                s => s.Postcode.IndexOf(term, StringComparison.InvariantCultureIgnoreCase) > -1 &&
                string.IsNullOrEmpty(country) ? true : s.CountryRegionID.Equals(country, StringComparison.InvariantCultureIgnoreCase)
            )
            .Select(p => new { label = p.Postcode, value = p.RecID })
            .ToList();

Теперь я ожидал, что это вернет все почтовые индексы, соответствующие как стране, так и термину, но по какой-то причине он совпадает только с термином, если страна нулевая, а затем, если страна не нулевая, он игнорирует термин и просто соответствует стране.

Если я поставлю скобки вокруг троичного:

return Postcodes
            .Where(
                s => s.Postcode.IndexOf(term, StringComparison.InvariantCultureIgnoreCase) > -1 &&
                (string.IsNullOrEmpty(country) ? true : s.CountryRegionID.Equals(country, StringComparison.InvariantCultureIgnoreCase))
            )
            .Select(p => new { label = p.Postcode, value = p.RecID })
            .ToList();

Тогда это работает именно так, как я ожидал. Почему дополнительная пара скобок имеет значение, так как анализ кода всегда жалуется на то, что я ставлю скобки вокруг троичных?

1 ответ

Решение

В C# троичный оператор имеет более низкий приоритет, чем условный оператор AND. Таким образом, без скобок И вычисляется перед троичным оператором, и у вас есть троичный оператор, который проверяет почтовый индекс И страну. Т.е. по умолчанию

( checkPostcode && countryNotNull) ? true : checkCountry

Когда вы добавляете скобки, вы разделяете троичный оператор, который проверяет страну по проверке почтового индекса.

checkPostcode && (countryNotNull ? true : checkCountry)

См. 7.2.1 Приоритет оператора и ассоциативность

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