2016-10-04 54 views
4

當一個類是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上默認都不起作用的原因是什麼?

+0

最有可能的,因爲實際結果(不是你的具體情況,但總體來說)將是混亂的,即'類MyComparable:IComparable的,IComparable的,IComparable的'將是一個有趣的案例。對於一般的「爲什麼功能不在語言中」,請查看[減去100分](https://blogs.msdn.microsoft.com/ericgu/2004/01/12/minus-100-points/)文章。 –

+0

看到https://github.com/dotnet/roslyn/issues/8633 – MotKohn

回答

9

當一個類是IComparable的時候,我們知道所有的東西都會因爲CompareTo的功能而超載<,>和==運算符,對吧?

是的。

我分享你的無奈。你的投訴是我列舉的十件讓我對C#感到不滿的事情的第九名。

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

那爲什麼不是這些自動超載?

功能默認情況下不實現,必須有理由刪除它們。相反,功能需要設計,指定,實施,測試,記錄和發運。如果其中一件事情沒有發生,就沒有功能。

沒有那些事情發生您的期望的功能。這個功能已經提出,但從來沒有接近語言設計團隊時間最佳用途列表的頂部。

如果你想要這個功能足夠糟糕,你可以隨時在Roslyn Github論壇上討論它,也許它會在某一天實現。

0

在Roslyn Github論壇上已經有一個proposal這個功能。這是封閉的原因有兩個:

  • 第一:如果它沒有以「明顯」的方式實現,它可能會破壞某人的代碼。
  • 第二:默認==運營商通過參考比較改變它到CompareTo將打破代碼。

有一個Nu的包,應該做OP的願望,我沒有測試它。 https://www.nuget.org/packages/Exts.Comparisions.Classes.Operators/

+0

我明白改變==操作符的行爲的問題,但沒有任何理由,這不能爲<, >,<= and > =運營商來實現? –

+0

@mrlucks請參閱上述建議鏈接。你的論點是在那裏做出的。我認爲最後的推理是我首先提到的原因。 – MotKohn