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



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

我提取了我的代码:

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。由于短路,三元条件甚至永远不会被执行。

最新更新