Linq where 三元和括号

Linq where with ternary and brackets

我有以下查询:

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 所有邮政编码都匹配国家和术语,但出于某种原因,它只匹配术语,如果国家为空,然后如果国家不为空,它忽略字词,正好匹配国家/地区。

如果我把三元括起来:

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();

然后它就如我所料的那样工作了。为什么额外的一对括号会有所不同,因为代码分析总是抱怨我把括号放在三元组周围?

在 C# 中,三元运算符的优先级低于条件 AND 运算符。因此,在三元运算符之前没有括号 AND 评估,并且您有检查邮政编码和国家/地区的三元运算符。 IE。默认

( checkPostcode && countryNotNull) ? true : checkCountry

当您添加括号时,您拆分了通过邮政编码检查国家/地区的三元运算符

checkPostcode && (countryNotNull ? true : checkCountry)

7.2.1 Operator precedence and associativity