为什么Enumerable.SequenceEqual如果任何参数为null则抛出异常?

Val*_*zub 10 c# linq

我试图Enumerable.SequenceEqual(x,y)按照我的预期使用它基于Object.Equals(x,y)方法工作 ,如果x或y为null则返回false,如果两者都为null,则返回true(对于null情况).

但是,Enumerable.SequenceEqual(x,y)如果任何参数是空引用,则抛出异常,如果给出两个空值,则不返回true.

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

Chr*_*Wue 5

嗯,MSDN 文档明确指出,ArgumentNullException如果传入的序列中的任何一个为空,它就会抛出异常。我认为这是为了与“标准行为”保持一致,其中NullReferenceException当您尝试取消引用对象时,对象会抛出 a 。考虑一下:

 List<int> foo = null;
 foo.SequenceEqual(new List<int>());
Run Code Online (Sandbox Code Playgroud)

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