Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在C#中重载条件运算符吗?_C#_Conditional Operator - Fatal编程技术网

我可以在C#中重载条件运算符吗?

我可以在C#中重载条件运算符吗?,c#,conditional-operator,C#,Conditional Operator,在我发布这篇文章之前,我确实经历过。但是这些是C++的。同样的事情也适用于C#吗?我提供的第二个链接指出,条件运算符不能重载,我不明白为什么(假设同样适用于C#)。有人能提供进一步阅读的链接,或者只是澄清问题 编辑: 我并没有接触到任何需要重载这个操作符的实际场景,但我只是好奇为什么它不能重载。是否只是因为没有任何实际可能的情况下,此类重载可以提供任何重要的功能?可重载运算符的列表如下所示。有些你能,有些你不能 页面显示如何重载可以重载的 至于条件运算符(?:),不,不能重载它。这是针对布尔人的

在我发布这篇文章之前,我确实经历过。但是这些是C++的。同样的事情也适用于C#吗?我提供的第二个链接指出,条件运算符不能重载,我不明白为什么(假设同样适用于C#)。有人能提供进一步阅读的链接,或者只是澄清问题

编辑:


我并没有接触到任何需要重载这个操作符的实际场景,但我只是好奇为什么它不能重载。是否只是因为没有任何实际可能的情况下,此类重载可以提供任何重要的功能?

可重载运算符的列表如下所示。有些你能,有些你不能

页面显示如何重载可以重载的

至于条件运算符(?:),不,不能重载它。这是针对布尔人的。如果你真的超负荷了,那意味着什么?这是if/then/else的简写

我想你可以重新表述这个问题的方式是:“为什么我不能过载if/then/else”

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


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

否,
?:
不能重载。文件中明确指出:


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

不能重载只对布尔值进行操作的运算符。C#中的重载意味着当类型与运算符结合使用时,可以为类型指定特定的行为

我认为这样做的唯一原因是允许某种“真正的ish”值,如:

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

这就是您要做的吗?

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

本手册第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).

可重载的二进制运算符包括:

+-*/%&| ^>=!=><>=,选中、未选中、新建、typeof、默认、as和is运算符


您可以有意义地重载自定义类型的
+
运算符,以提供有用的功能。如何有意义地重载条件运算符?
condition?真:假
?我不认为这可以被重载,因为它的功能类似于
if
。我也不知道这什么时候会有用?这将是一个实现的好方法。没有提到为什么部分。更新了我的帖子。我同意@David Morton的观点-这与重载“if/then/else”是一样的。没有提到为什么部分。我希望你必须等待一位规范编写者出现,然后才能得到“为什么”。澄清了一些问题,仍然有点进退两难,但我想我现在对“为什么”部分有点了解。谢谢。什么是进退两难?也许您希望重载相等运算符。这是你能做到的。没有什么进退两难的问题,我只是好奇为什么不允许这样做。我会慢慢了解事实。谢谢你。