3

在实际发布之前,我确实经历了这个这个。但这些是针对 C++ 的。同样的事情也适用于 C# 吗?我提供的第二个链接指出条件运算符不能重载,我没有看到原因(假设同样适用于 C#)。有人可以提供进一步阅读的链接,或者只是澄清此事?

编辑:

我没有遇到任何需要重载此运算符的实际场景,但我只是好奇为什么不能重载它。仅仅是因为没有任何实际可能的情况,这种重载可以提供任何重要的功能吗?

4

4 回答 4

6

可重载运算符列表在这里。有些你可以,有些你不能。

页面显示如何重载可以重载的那些。

至于条件运算符(?:),不,你不能重载它。它特定于布尔值。如果你真的超载它意味着什么?它是 if/then/else 的简写。

我想你可以改写这个问题的方式是:“为什么我不能超载 if/then/else”?

真正的原因很可能与该语言的设计者选择不实现它有关。很可能,为该运算符提供重载并不能提供足够的好处来值得进行使其可重载的测试和努力。简而言之,这可能是时间/金钱的原因。对于添加到计算机语言中的每个功能,这意味着时间、精力和测试,必须与功能提供的好处相平衡。

最后,有些事情根本不值得实施。虽然我确信您可以从中找到一些好处,但实施成本可能超过了好处。

于 2012-07-27T14:42:51.393 回答
2

不,?:不能重载。它在文档中特别说明:http: //msdn.microsoft.com/en-us/library/8edha89s%28VS.71%29.aspx

如果你问我,这是有充分理由的。?:影响控制流,因此重载意味着您​​必须验证表达式中变量的类型以评估控制流 -每次您试图弄清楚一段代码在做什么时。

于 2012-07-27T14:43:21.100 回答
1

不,您不能重载条件运算符。

C# Language Specification 4.0的第 7.3.2 节涵盖了运算符重载:

7.3.2 运算符重载

所有一元和二元运算符都有预定义的实现,可在任何表达式中自动使用。除了预定义的实现之外,还可以通过在类和结构中包含运算符声明来引入用户定义的实现(第 10.10 节)。用户定义的运算符实现总是优先于预定义的运算符实现:仅当不存在适用的用户定义的运算符实现时,才会考虑预定义的运算符实现,如第 7.3.3 节和第 7.3.4 节所述。

可重载的一元运算符有:

+ - !~ ++ -- 真假

尽管 true 和 false 没有在表达式中显式使用(因此不包括在 §7.3.1 的优先级表中),但它们被视为运算符,因为它们在几个表达式上下文中调用:布尔表达式(§7.20)和涉及条件(第 7.14 节)和条件逻辑运算符(第 7.12 节)。

可重载的二元运算符有:

+ - * / % & | ^ << >> == != > < >= <=

只有上面列出的运算符可以重载。特别是,不能重载成员访问、方法调用或 =、&&、||、??、?:、=>、checked、unchecked、new、typeof、default、as 和 is 运算符

...

于 2012-07-27T14:57:19.713 回答
0

您不能重载仅对布尔值进行操作的运算符。C# 中的重载意味着当 Type 与运算符一起使用时,您可以为它指定特定的行为。

我可以看到这样做的唯一原因是允许某种“真实的”值,例如:

1 == true
0 == false
null == false
new string[] {} == false

这是你想要做的吗?

于 2012-07-27T14:48:02.363 回答