在一个无法理解的错误之后,我发现&&
运算符有一个奇怪的行为。
我提取了我的代码:
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 中测试的代码
有人在同样的情况下通过了吗?
这种行为是正确的。让我们看看:
string s = "123";
Console.WriteLine(false && s.Length < 2 ? true : s.Substring(0,2).ToUpper() != "GA");
三元表达式的表达式为:false && s.Length < 2
//s。长度为3=>3<2==错误
因此,表达式s.Substring(0,2).ToUpper() != "GA"
被执行并且返回true
作为"12" != "GA"
。
它被评估为(false && s.Length < 2) ? true : s.Substring(0,2).ToUpper() != "GA"
,其中条件为false
,因此最终为s.Substring(0,2).ToUpper() != "GA"
,这是真的。
值得注意的是,如果优先级是您想要/期望的,那么结果总是false
。由于短路,三元条件甚至永远不会被执行。