我正在尝试使用 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/