2012-11-20 84 views
0

我需要計算所有選中的複選框和我意使用運算符重載爲這個例子:重載+布爾此外

public static int operator +(bool b1, bool b2) 
{ 
    int i1 = 0; 
    int i2 = 0; 

    if (b1) i1 = 1; 
    if (b2) i2 = 1; 

    return i1 + i2; 
} 

然後總將由

int countCbx = cbx1.Checked + cbx2.Checked + ... 

簡單檢索但它不起作用,我不明白爲什麼。編譯錯誤是「二元運算符的一個參數必須是包含類型」。 邏輯看起來不錯,但這是我第一次使用運算符超負荷外的例子。

感謝您的幫助。

回答

6

但它不工作,我不明白爲什麼。

因爲語言規範是這樣說的。編譯器基本上給你的理由。

邏輯似乎不錯,但這是我第一次使用運算符超負荷的例子。

體成員的的邏輯是好的 - 但你不能超載運營商的任意類型。至少操作數(或轉換返回類型)之一必須是,你宣佈運營商在類型

的C#5規範中包含這部分10.10:

像其他成員,在基類中聲明的運算符都由派生類繼承。由於運算符聲明總是要求運算符聲明的類或結構體參與運算符的簽名,因此在派生類中聲明的運算符不可能隱藏在基類中聲明的運算符。因此,新的修飾符在運算符聲明中從不要求,因此也不允許。

即規則強制執行然後在10.10.1:

下列規則適用於一元運算符聲明,其中T表示包含運算符聲明的類或結構的實例類型:

  • 一元+, - ,!或〜運算符必須使用T或T類型的單個參數嗎?並可以返回任何類型。
  • ...

.... 10.10.2:

下列規則適用於二進制運算符聲明,其中T表示含有的類或結構的實例類型運算符聲明:

  • 二進制非移位運算符必須帶兩個參數,其中至少一個必須具有T或T?類型,並且可以返回任何類型。
  • 一個二進制<<>>運算符必須帶兩個參數,其中第一個參數必須是T或T?其中第二個必須具有int或int類型,並且可以返回任何類型。

...和10.10.3:

對於給定的源類型S和目標類型T,如果S或T是空類型,讓S0和T0是指它們的基礎類型,否則S0和T0分別等於S和T.只有滿足以下所有條件,才允許類或結構聲明從源類型S到目標類型T的轉換:

  • S0和T0是不同的類型。
  • S0或T0是運算符聲明發生的類或結構類型。
  • ...
+0

感謝您給我們的相關詳細解釋:)的工作示例 –

2

的編譯錯誤,告訴你什麼是錯的。

「一個二進制運算符的參數必須是包含類型」

不能重載操作者以外的類型(或者類型中的一種)的定義內你」重新加載它。

我可以建議

int countCbx = new[] { cbx1, cbx2, ... }.Count(c => c.Checked); 
4

你不能這樣做,僅僅是因爲語言不允許這樣做。加法運算符不能重載以使用bool值,並且因爲bool不能隱式轉換爲任何算術類型(例如在C++中),所以超出了選項範圍。

如果你要計算的檢查箱子的數量,比如,你可以使用

var count = (new[] { cbx1, cbx2, ... }).Count(cb => cb.Checked); 
+0

+1。你甚至可以保存2個字符,不需要parens:'new [] {cbx1,cbx2,...} .Count(cb => cb.Checked);' – Firo