实现“IComparable<T>”时不抛出的理由?

Reasons to not throw when implementing `IComparable<T>`?

提问人:sm_ 提问时间:10/4/2019 更新时间:10/4/2019 访问量:86

问:

是否有任何反对在实现中抛出的论据?IComparable<T>.CompareTo(T value)

不扔有意义吗,为什么?Nullable<T>.Compare(null, notNullValue)

C# .NET 比较 可为 null icomparable

评论

1赞 TimChang 10/4/2019
扔什么?例外?
0赞 CoolBots 10/4/2019
我们说的是 s,对吧?好吧,从 C# 8 开始,只需在实现nullthrowwhere T: notnullIComparable<T>
1赞 Flydog57 10/4/2019
重要的是你要遵守规则。它们可以粗略地概括为“遵循三分法则”(如果 A<B 和 B<C,则 A<C)和“一致”(如果 A<B,则它总是小于 B,如果 B=D,那么它们总是相等且 A<D)。如果进行比较,我会感到非常惊讶,但如果排序少于任何其他值,我不会感到惊讶。另外,请记住,在 C# 中(与 SQL 不同)IComparablenullnull=null
0赞 TheGeneral 10/4/2019
在 a 中抛出 null 就像在代码 IMO 中给你的同事留下一个大的未记录的陷阱IComparable.CompareTo
0赞 sm_ 10/4/2019
@TheGeneral愿意用一个例子来详细说明更多?

答:

2赞 tymtam 10/4/2019 #1

不抛出的原因是不需要它,并且 IComparable.CompareTo(T) 方法的签名未指定任何异常,因此您将破坏合约。

(顺便说一句。IComparable.CompareTo(Object) 方法允许 )。ArgumentExecption


Nullable.Compare(null, notNullValue) 不抛出有意义吗,为什么?

是的,不扔是有道理的,因为价值在事物的顺序中占有一席之地。例如,如果数据库中有一个可为 null 的列,您仍然可以对其进行排序。在 SELECT - ORDER BY 子句 (Transact-SQL) 中,可以读取:null

ASC公司 |DESC

指定指定列中的值应按升序或降序排序。ASC 从最低值到最高值排序。DESC 从最高值到最低值排序。ASC 是默认排序顺序。Null 值被视为可能的最小值。[强调我的]

评论

0赞 sm_ 10/8/2019
Null 或未定义值的含义不应该是一个领域问题,而不是默认为框架或 SQL 标准吗?