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

Dun*_*Luk 4 c# comparison operator-overloading

当一个类IComparable,那么我们就知道一切的过载<,>==运营商由于CompareTo功能吧?那为什么这些不会自动超载?

看看下面的例子:

public class MyComparable : IComparable<MyComparable>
{
    public int Value { get; }
    public MyComparable(int value) { Value = value; }

    public int CompareTo(MyComparable other) => Value.CompareTo(other.Value);
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么这样的东西默认不起作用:

MyComparable obj1 = new MyComparable(1),
             obj2 = new MyComparable(2);

if (obj1 < obj2) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

我们知道,obj1 < obj2 == true由于我们的实现CompareTo,但由于<运算符没有超载,这将无法正常工作.(我知道这obj1.CompareTo(obj2) < 0会产生预期的结果,但在大多数情况下这不太明显.)

只有当我将下面的代码添加到类中时,它才会按照我预期的方式工作:

public static bool operator <(MyComparable x, MyComparable y) => x.CompareTo(y) < 0;
public static bool operator >(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;
}
Run Code Online (Sandbox Code Playgroud)

这是非常通用的功能,那么这些比较默认情况下每个都不起作用的原因是什么IComparable

Eri*_*ert 9

当一个类是IComparable时,由于CompareTo功能,我们知道要重载<,>和==运算符的所有东西,对吧?

是的.

我分享你的沮丧.你的投诉是我在C#上激怒我的十件事的清单上的第九号.

http://www.informit.com/articles/article.aspx?p=2425867

那为什么这些不会自动超载?

默认情况下不会实现功能,必须有理由删除它们.相反,需要设计,指定,实施,测试,记录和发送功能.如果其中一件事没有发生,没有任何功能.

这些事情都没有发生在您想要的功能上.该功能已被提出,但从未接近语言设计团队时间最佳用途列表的顶部.

如果你想要这个功能非常糟糕,你可以随时在Roslyn Github论坛上进行推广,也许它会在某一天实施.