为什么比较运算符不会自动超载IComparable?
当一个类是IComparable
,由于CompareTo
function,我们知道所有重载<
, >
和==
运算符的东西,对吧? 那么为什么这些不会自动超载?
看看下面的例子:
public class MyComparable : IComparable { public int Value { get; } public MyComparable(int value) { Value = value; } public int CompareTo(MyComparable other) => Value.CompareTo(other.Value); }
我想知道为什么这样的东西默认不起作用:
MyComparable obj1 = new MyComparable(1), obj2 = new MyComparable(2); if (obj1 < obj2) { /*...*/ }
我们知道obj1 < obj2 == true
因为我们实现了CompareTo
,但由于<
运算符没有重载,所以这不起作用。 (我知道obj1.CompareTo(obj2) < 0
将给出所需的结果,但在大多数情况下这不太明显。)
只有当我将下面的代码添加到类中时,它才会按照我预期的方式工作:
public static bool operator x.CompareTo(y) (MyComparable x, MyComparable y) => x.CompareTo(y) > 0; // And for equality: public static bool operator !=(MyComparable x, MyComparable y) => !(x == y); public static bool operator ==(MyComparable x, MyComparable y) { if (ReferenceEquals(x, y)) return true; if (((object) x == null) || ((object) y == null)) return false; return x.CompareTo(y) == 0; }
这是非常通用的function,那么这些比较在每个IComparable
上默认不起作用的原因是什么?
当一个类是IComparable时,由于CompareTofunction,我们知道所有重载<,>和==运算符的东西,对吧?
是的。
我分享你的沮丧。 你的投诉在我列出的关于C#的十件事情的名单上排名第九。
http://www.informit.com/articles/article.aspx?p=2425867
那么为什么这些不会自动超载?
默认情况下不会实现function,必须有理由删除它们。 相反,需要设计,指定,实施,测试,记录和发送function。 如果其中一件事没有发生,没有任何function。
这些事情都没有发生在你想要的function上。 该function已被提出但从未接近语言设计团队时间最佳用途列表的顶部。
如果你想要这个function非常糟糕,你可以随时在Roslyn Github论坛上进行推广,也许它会在某一天实现。
Roslyn Github论坛上已经有一项关于此function的提案 。 它被关闭有两个原因:
- 第一:如果没有以“明显”的方式实施,它可能会破坏某人的代码。
- 第二:默认情况下,
==
运算符通过引用进行比较,将其更改为CompareTo
将中断代码。
有一个Nuget包应该像OP那样做,我没有测试它。 https://www.nuget.org/packages/Exts.Comparisions.Classes.Operators/