我试图Enumerable.SequenceEqual(x,y)按照我的预期使用它基于Object.Equals(x,y)方法工作
,如果x或y为null则返回false,如果两者都为null,则返回true(对于null情况).
但是,Enumerable.SequenceEqual(x,y)如果任何参数是空引用,则抛出异常,如果给出两个空值,则不返回true.
在我的代码中,我经常检查集合相等性,所以我创建了一个模拟Object.Equals序列行为的方法,但我只是想知道这种默认行为背后的逻辑是什么,是否有一个现有的方法在null上没有例外?
嗯,MSDN 文档明确指出,ArgumentNullException如果传入的序列中的任何一个为空,它就会抛出异常。我认为这是为了与“标准行为”保持一致,其中NullReferenceException当您尝试取消引用对象时,对象会抛出 a 。考虑一下:
List<int> foo = null;
foo.SequenceEqual(new List<int>());
Run Code Online (Sandbox Code Playgroud)
这是SequenceEqual一个扩展方法,因此可以处理空对象,但它也会令人困惑。据我所知,Linq 提供的每个扩展方法都遵循这种行为。此外,您不需要为每个扩展方法处理特殊的 null 情况(您需要就合理的行为达成一致并添加额外的逻辑并维护和测试它)。从框架的角度来看,说它是非法的会使其更加健壮(针对逻辑错误)并且一致。我经常使用 Linq,但从未遇到过这个问题 - 我只是确保所有序列都不为空。大大减少代码混乱(从代码中删除大量空检查)。
| 归档时间: |
|
| 查看次数: |
4141 次 |
| 最近记录: |