4

我的一个 LINQ 查询有问题,所以我在 LINQPad 中制作了它的简化版本来帮助我。问题是,我不明白为什么它仍然没有做我认为应该做的事情......

var list = "1 2 3 4".Split();
var result = list.FirstOrDefault(x =>
                    x == "3"
                    && true);
result.Dump();

3就像人们假设的那样,这会回馈。
但是,当我运行这个时:

var list = "1 2 3 4".Split();
var result = list.FirstOrDefault(x =>
                    x == "3"
                    && false ? false : true);

1回来。最后一行是实际代码的简化。这两个示例都应该true在最后一行给出,这将返回3,但是带有条件运算符的查询在那里抛出了一个扭结。

我错过了什么?

4

4 回答 4

8

您的测试表达式是这样关联的:

(x == "3" && false) ? false : true

而不是这样:

x == "3" && (false ? false : true)
于 2012-04-17T20:23:23.370 回答
2

您所看到的是由于运算符优先级。一个解决方法是将条件包装在括号中:

x == "3" && (false ? false : true)

&& 的优先级高于 ?:

于 2012-04-17T20:23:55.063 回答
1

这很重要,(x == "3" && false) ? false : true这就是您有奇怪行为的原因。

于 2012-04-17T20:23:47.920 回答
0

我怀疑您的 lambda 评估(x == 3 && false) ? false : true将返回第一个元素,因为条件将始终评估为 false。为更清晰的代码加上括号。

于 2012-04-17T20:28:24.943 回答