在一个无法理解的错误之后,我发现&&
运算符的异常行为。
我提取了代码:
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中测试过的代码
有人通过了同样的情况?
答案 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
。由于短路,三元条件将永远不会执行。