为什么List <T> .Sort(IComparer <T>)和List <T> .Sort(Comparison <T>)处理拐角案例的方式不同?

时间:2019-11-02 13:05:10

标签: c# .net sorting

1,Sort(IComparer<T>)将在其参数为空时尝试使用Comparer<T>.Default
Sort(Comparison<T>)将抛出ArgumentNullException
比较参数为null时,是否有任何理由反对尝试使用Comparer<T>.Default.Compare

2,即使T不是Sort(IComparer<T>),对于少于两个元素的列表,IComparable也不会引发异常。
另一方面,当参数为null时,Sort(Comparison<T>)总是抛出ArgumentNullException
这种方法不应该允许同样的松动吗?

1 个答案:

答案 0 :(得分:0)

  

为什么List.Sort(IComparer)和List.Sort(Comparison)   以不同的方式处理极端情况?

因为那些函数的程序员决定了。决定之后,在不破坏现有代码的情况下不能再更改行为。更改它的唯一方法是弃用整个类以创建一个新类。而且,这种微不足道的问题不值得进行那种努力。

除非他们或那个时代的某个人碰巧是偶然的,否则猜测他们的原因就只是猜测。

欢迎使用技术债务/历史悠久的问题。您会在每种语言,每种库中找到这些语言。尽一切努力和开发资源,.NET也不例外。

话虽这么说,但猜测/专业意见:

  

当比较参数为null时,是否有任何理由反对尝试使用Comparer.Default.Compare?

是否有任何原因抛出Invalid Cast异常/编译器错误,而不是隐式进行转换?是的,因为在60多年的编程历史中,隐式运算引起了各种问题。积极使用“修复程序”正是导致此comic中的PHP和Javascript示例的原因。提示:在两种情况下,JS都会做错事。偶然碰巧会得到正确的结果。

没有什么愚蠢的,因为代码会变得聪明。尝试自己修复输入变量(尤其是null值)是尝试变得聪明的一种情况。如果他们想要默认的比较器,他们可以只使用无参数的Sort()。在将其作为参数传递给函数之前,先检查其值是否为空。

例外是编程人员不应忽略的错误。在该区域的正上方提供一个空值。