为什么比较运算符不会自动超载IComparable?

当一个类是IComparable ,由于CompareTofunction,我们知道所有重载<>==运算符的东西,对吧? 那么为什么这些不会自动超载?

看看下面的例子:

 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/