当一个类实现了
请看下面的示例:
我想知道为什么这样的东西默认情况下不起作用:
我们知道
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);
}
我想知道为什么这样的东西默认情况下不起作用:
。
MyComparable obj1 = new MyComparable(1),
obj2 = new MyComparable(2);
if (obj1 < obj2) { /*...*/ }
我们知道
CompareTo
的实现使得obj1 < obj2 == true
,但是由于未重载<
运算符,这将不起作用。(我知道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;
}
这是非常通用的功能,那么为什么这些比较功能不能在每个 IComparable
上默认工作呢?
class MyComparable : IComparable<MyComparable>,IComparable<int>, IComparable<string>
将是一个有趣的案例。对于一般的“为什么语言没有这个功能”的问题,请查看 minus 100 points 文章。 - Alexei Levenkov