c# - 如果任何参数为空,为什么 Enumerable.SequenceEqual 会抛出异常?

标签 c# linq

我正在尝试使用 Enumerable.SequenceEqual(x,y) 因为我希望它基于 Object.Equals(x,y) 方法,如果 x 或 y 为 null,则返回 false,如果两者均为 null(对于 null 情况),则返回 true。

但是,如果任何参数为 null 引用,Enumerable.SequenceEqual(x,y) 将抛出异常,如果给它两个 null,则不会返回 true。

在我的代码中,我经常检查集合相等性,所以我创建了一个方法来模拟序列的 Object.Equals 行为,但我只是想知道这种默认行为背后的逻辑是什么,并且可能有一个现有方法没有空值异常?

最佳答案

嗯,MSDN documentation明确声明它会抛出一个 ArgumentNullException 以防任何一个传入的序列为空。我认为这是为了与“标准行为”保持一致,即当您尝试取消引用对象时,对象会抛出 NullReferenceException 。考虑一下:

 List<int> foo = null;
 foo.SequenceEqual(new List<int>());

这没问题,因为 SequenceEqual 是一个扩展方法,因此可以处理空对象,但它也会造成混淆。据我所知,Linq 提供的每个扩展方法都遵循这种行为。此外,您不需要为每个扩展方法处理特殊的 null 情况(您需要就明智的行为达成一致并添加额外的逻辑并维护和测试它)。说它是非法的使它更健壮(针对逻辑错误)并且从框架的角度来看是一致的。我经常使用 Linq,从来没有遇到过这个问题——我只是确保我的所有序列都不为空。大大减少代码困惑(从代码中删除大量空检查)。

关于c# - 如果任何参数为空,为什么 Enumerable.SequenceEqual 会抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6407246/

相关文章:

c# - .Net 3.5 到 4 的迁移导致应用程序变慢

c# - Linq 查询列表包含具有相同顺序的列表

LINQ 查询到 SQL 脚本

c# - (避免)装箱为空

c# - 在文本框中显示 ListView 的值

c# - 编码 .NET 泛型类型

c# - 调用结果对等待任务的影响

c# - OrderBy [ Descending ]() 和 SkipWhile() 的意外行为

vb.net - Linq 查询处理空值

c# - 在不使用 string.Join 的情况下加入 string[]