2016-08-23 59 views
2

C#是一種多功能語言;它給你很大的自由來操縱你自己的和現有的類。您可以重載運算符以將+*用於自定義對象,並且可以擴展現有對象以向其中添加新方法。但出於某種原因,C#不允許您將操作符重載作爲現有類的擴展。爲什麼是這樣?是否有解決方法,或者如果我想爲現有類編寫運算符重載,那麼我應該只製作.Plus().Times()擴展方法?C# - 操作符重載擴展

+0

要清楚,_extension methods_不會將新方法添加到現有對象。它們允許調用帶有第一個類型的第一個參數的靜態方法,該類型的第一個參數可以通過類型繼承的類的實例上的「點運算符」語法來選擇性地調用。這只是「語法糖」。 –

回答

1

三個選項:

  1. 他們的子類,並寫重載子類
  2. 使用微軟的各個類別公開的源代碼(或反編譯它們),並撰寫過載。這從長遠來看是不可維護的,或者一定很容易,但它會起作用。
  3. 堅持你的擴展方法。
  4. 您的班級與「克隆」班級之間的轉換操作符如下所述。

在評論中,OP特別提到了使用System.Drawing.PointF。我過去所做的與此類密封類一樣,是使用.NET源代碼開發第二個類似的類,如上所述。我們稱之爲第二類MyCustomPointF。我可以爲我的新課程編寫操作符。但是我也要添加的是所謂的implicit conversion operator,它幫助編譯器在我需要的時候(不調用外部轉換函數)將我的類的實例轉換回System.Drawing.PointF實例。這並不完美,但它是一種選擇。

+0

無法真正反編譯它,因爲它是.NET對象,即PointF,它也是密封的。換句話說,沒有解決方法? – Maurdekye

+0

@Maurdekye你永遠不需要*反編譯.NET對象。 .NET公開提供它們的源代碼。 – Servy

+0

@Servy好點。要稍微改變一下文字以反映這一點。 –