重载+用于布尔加法

Use*_*ous 0 c# operator-overloading

我需要计算所有选中的复选框,我的意思是使用运算符重载作为此示例:

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;
}
Run Code Online (Sandbox Code Playgroud)

然后通过简单检索总数

int countCbx = cbx1.Checked + cbx2.Checked + ...
Run Code Online (Sandbox Code Playgroud)

但它不起作用,我不明白为什么.编译错误是"二元运算符的参数之一必须是包含类型".逻辑似乎很好,但这是我第一次在示例之外使用运算符重载.

谢谢你的帮助.

Jon*_*eet 6

但它不起作用,我不明白为什么.

因为语言规范是这样说的.编译器基本上是给你原因的.

逻辑似乎很好,但这是我第一次在示例之外使用运算符重载.

成员正文的逻辑很好 - 但你不能为任意类型重载运算符.至少有一个操作数(或转换的返回类型)必须是您声明操作符的类型.

C#5规范在第10.10节中包含了这一点:

与其他成员一样,在基类中声明的运算符由派生类继承.因为运算符声明总是要求声明运算符的类或结构参与运算符的签名,所以在派生类中声明的运算符不可能隐藏在基类中声明的运算符.因此,在操作符声明中永远不需要new修饰符,因此从不允许.

然后在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是发生运算符声明的类或结构类型.
  • ...