當一個類是IComparable
,那麼我們知道所有的東西都會由於CompareTo
的功能而超載<
,>
和==
運算符,對吧?那爲什麼不自動重載呢?爲什麼比較運算符不能自動重載IComparable?
看看下面的例子:
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) { /*...*/ }
我們知道,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;
}
這是非常通用的功能,所以這些比較在每個IComparable
上默認都不起作用的原因是什麼?
最有可能的,因爲實際結果(不是你的具體情況,但總體來說)將是混亂的,即'類MyComparable:IComparable的,IComparable的,IComparable的'將是一個有趣的案例。對於一般的「爲什麼功能不在語言中」,請查看[減去100分](https://blogs.msdn.microsoft.com/ericgu/2004/01/12/minus-100-points/)文章。 –
看到https://github.com/dotnet/roslyn/issues/8633 – MotKohn