相关疑难解决方法(0)

为什么IQueryable.All()在空集合上返回true?

所以我遇到了今天的情况,其中一些生产代码正在失败,因为一个方法完全按照MSDN中的说明执行.因为没有阅读文档而感到羞耻.然而,我仍然在摸索为什么它会以这种方式行事,即使是"按设计",因为这种行为正好与我预期的(和其他已知行为)相反,因此似乎违反了原则最不惊讶的.

All()方法允许您提供谓词(例如lambda表达式)来测试IQueryable,返回一个布尔值,指示所有集合成员是否与测试匹配.到现在为止还挺好.这就是它变得奇怪的地方. 如果集合为空,All()也会返回true.由于以下原因,这似乎完全落后于我:

  • 如果集合为空,那么这样的测试充其量是未定义的.如果我的车道是空的,我不能断言停在那里的所有车都是红色的.有了这种行为,在空车道上停放的所有车辆都是红色和蓝色和棋盘 - 所有这些表达式都将返回true.
  • 对于熟悉SQL概念的人来说,NULL!= NULL,这是意外的行为.
  • Any()方法按预期行为,并且(正确)返回false,因为它没有任何与谓词匹配的成员.

所以我的问题是,为什么All()这样做?它解决了什么问题?这是否违反了最不惊讶的原则?

我将此问题标记为.NET 3.5,但该行为也适用于.NET 4.0.

编辑 好的,所以我掌握了这个逻辑方面,正如杰森和你们其他人所做的那样.不可否认,空集合是一种边缘情况.我想我的问题根植于斗争,只是因为某些东西是合乎逻辑的并不意味着如果你没有处于正确的思维框架中,它必然是有道理的.

.net linq logic

48
推荐指数
4
解决办法
5218
查看次数

标签 统计

.net ×1

linq ×1

logic ×1