2010-02-20 105 views
13

可能重複:
Is it possible to create a new operator in c#?在C#中定義新的運算符?

我愛C#,但有一點我希望它是定義在類的我自己的運營商,>像A = B而不是能力(B)。我認爲如果你可以在一個類的方法中分配一個任意長度的標識符,那麼這將是非常酷的,然後像一個運算符那樣使用它。[+ - */&^|%$#@> <] +有人知道是否有某種擴展,或者甚至可以創建一個,這是否是這樣?

回答

10

這不是內置於該語言。您堅持重載語言附帶的預定義操作符(overloadable operators)。

如果你喜歡這種調試方式,你可能要考慮F#。它是一種運行在.NET框架之上的功能性語言,使您能夠定義任何您想要的操作符。

+5

經過多年C++項目,我不得不強烈反對你對「可悲」一詞的使用。 – 2010-02-20 21:14:33

+1

傷心地刪除了這個詞。最近,我用F#和紅寶石玩他們的內聯DSL魔術太多了。 – smaclell 2010-02-20 21:18:51

0

總之,沒有。你將不得不看另一種語言。你可以重載許多運算符,或者定義任何其他方法(包括非常方便的擴展方法) - 但是你不能在我知道的任何C#變體中定義自定義運算符。

+0

並且您對現有操作員可以執行的操作有限制 - 例如,如果你定義了'==',你必須定義'!='等,並且參數/返回類型在所有情況下都不完全打開。 – 2010-02-20 21:07:54

0

不,這是不可能的,除非你自己製作類似C#的編譯器。

您只能覆蓋一些內置運算符,您不能創建新運算符,並且lambda運算符(=>)不能被覆蓋。

3

可以重載的操作員列表是here

運算符重載只允許您更改運算符的行爲,而不是定義新運算符。

儘管A => B作爲A.Implies(B)聽起來很酷,但它會在稍後(6個月內,當您試圖弄清楚代碼應該做什麼時)導致問題。

+8

通過這個論點,我們應該使用'a.Plus(b)',以防萬一我們忘記算術或字符串連接中的'+'。如果您可以決定某個域名中某個符號的含義,然後大量使用它,則非常容易記住它的含義。如果你不打算使用它,不值得發明符號。所以在實踐中,這不是問題。 – 2010-02-20 21:14:50

+3

@艾瑞克:我不買它。 '+'是普遍理解的。儘管'=>'可能會讓你感覺到世界上的所有感覺,如果有其他人出現並且必須維護你的代碼,他們可能不會發現很容易實現或記住發生了什麼。 – 2010-02-20 21:24:41

+3

@David Brown:'+'表示C#中的字符串連接。它不在VB.NET中。所以它的所有含義都沒有被普遍理解。你認爲編寫代碼比較好,這樣一個不明身份的人可以慢慢閱讀它 - 考慮寫下它可能會更好,所以知情人可以快速閱讀它。在C#3出來後,大多數C#程序員都不知道lambda中的'=>'是什麼意思。C#團隊是否錯誤地使用該符號?不,他們期望社區能夠吸收新的意義。同樣,發明自己符號的圖書館也爲社區服務,您可以參與或不參與。 – 2010-02-20 21:35:23