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
。
这种方法不应该允许同样的松动吗?
答案 0 :(得分:0)
为什么List.Sort(IComparer)和List.Sort(Comparison) 以不同的方式处理极端情况?
因为那些函数的程序员决定了。决定之后,在不破坏现有代码的情况下不能再更改行为。更改它的唯一方法是弃用整个类以创建一个新类。而且,这种微不足道的问题不值得进行那种努力。
除非他们或那个时代的某个人碰巧是偶然的,否则猜测他们的原因就只是猜测。
欢迎使用技术债务/历史悠久的问题。您会在每种语言,每种库中找到这些语言。尽一切努力和开发资源,.NET也不例外。
话虽这么说,但猜测/专业意见:
当比较参数为null时,是否有任何理由反对尝试使用Comparer.Default.Compare?
是否有任何原因抛出Invalid Cast异常/编译器错误,而不是隐式进行转换?是的,因为在60多年的编程历史中,隐式运算引起了各种问题。积极使用“修复程序”正是导致此comic中的PHP和Javascript示例的原因。提示:在两种情况下,JS都会做错事。偶然碰巧会得到正确的结果。
没有什么愚蠢的,因为代码会变得聪明。尝试自己修复输入变量(尤其是null值)是尝试变得聪明的一种情况。如果他们想要默认的比较器,他们可以只使用无参数的Sort()。在将其作为参数传递给函数之前,先检查其值是否为空。
例外是编程人员不应忽略的错误。在该区域的正上方提供一个空值。