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)
但它不起作用,我不明白为什么.编译错误是"二元运算符的参数之一必须是包含类型".逻辑似乎很好,但这是我第一次在示例之外使用运算符重载.
谢谢你的帮助.
但它不起作用,我不明白为什么.
因为语言规范是这样说的.编译器基本上是给你原因的.
逻辑似乎很好,但这是我第一次在示例之外使用运算符重载.
成员正文的逻辑很好 - 但你不能为任意类型重载运算符.至少有一个操作数(或转换的返回类型)必须是您声明操作符的类型.
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是发生运算符声明的类或结构类型.
- ...