运算符逻辑与与内联(如果不兼容)

时间:2019-11-07 14:59:22

标签: c#

在一个无法理解的错误之后,我发现&&运算符的异常行为。

我提取了代码:

string s = "123";
Console.WriteLine(false && s.Length < 2 ? true : s.Substring(0,2).ToUpper() != "GA");

我希望结果是false,但它给了我true

要获得预期结果,我将第二条语句放在()

Console.WriteLine(false && (s.Length<2 ? true : s.Substring(0,2).ToUpper() != "GA"));

它给了我false

fiddle中测试过的代码

有人通过了同样的情况?

2 个答案:

答案 0 :(得分:4)

此行为是正确的。让我们看看:

string s = "123";
Console.WriteLine(false && s.Length < 2 ? true : s.Substring(0,2).ToUpper() != "GA");

三元表达式的表达式为:     false && s.Length < 2 // s.Length为3 => 3 <2 ==假

因此执行表达式s.Substring(0,2).ToUpper() != "GA"并以true的形式返回"12" != "GA"

答案 1 :(得分:1)

它被评估为(false && s.Length < 2) ? true : s.Substring(0,2).ToUpper() != "GA",其中条件为false,所以最终为s.Substring(0,2).ToUpper() != "GA",这是正确的。

值得一提的是,如果优先级符合您的期望/期望,其结果将始终为false。由于短路,三元条件将永远不会执行。