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?
当一个类是IComparable时,由于CompareTo功能,我们知道要重载<,>和==运算符的所有东西,对吧?
是的.
我分享你的沮丧.你的投诉是我在C#上激怒我的十件事的清单上的第九号.
http://www.informit.com/articles/article.aspx?p=2425867
那为什么这些不会自动超载?
默认情况下不会实现功能,必须有理由删除它们.相反,需要设计,指定,实施,测试,记录和发送功能.如果其中一件事没有发生,没有任何功能.
这些事情都没有发生在您想要的功能上.该功能已被提出,但从未接近语言设计团队时间最佳用途列表的顶部.
如果你想要这个功能非常糟糕,你可以随时在Roslyn Github论坛上进行推广,也许它会在某一天实施.