我需要计算所有选中的复选框,我的意思是使用运算符重载作为此示例:
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 + ...
但它不起作用,我不明白为什么。编译错误是“二元运算符的参数之一必须是包含类型”。 逻辑似乎很好,但这是我第一次在示例之外使用运算符重载。
感谢您的帮助。
答案 0 :(得分:6)
但它不起作用,我不明白为什么。
因为语言规范是这样说的。编译器基本上是给你原因的。
逻辑似乎很好,但这是我第一次在示例之外使用运算符重载。
成员的 body 的逻辑很好 - 但是你不能为任意类型重载运算符。至少有一个操作数(或转换的返回类型)必须是您声明操作符的类型。
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是发生运算符声明的类或结构类型。
- ...
答案 1 :(得分:4)
你不能仅仅因为语言不允许这样做。添加运算符不能重载以使用bool
值,并且由于bool
不能隐式转换为任何算术类型(例如在C ++中),因此没有选项。
如果要计算复选框的数量,可以使用
var count = (new[] { cbx1, cbx2, ... }).Count(cb => cb.Checked);
答案 2 :(得分:2)
编译错误会告诉您究竟出了什么问题。
“二元运算符的一个参数必须是包含类型”
除了要为其重载的类型(或其中一种类型)的定义之外,您不能重载运算符。
我可以建议
int countCbx = new[] { cbx1, cbx2, ... }.Count(c => c.Checked);