我知道您可以重载现有的运营商。我想知道是否可以创建一个新的运算符。这是我的情景。
我想要这个:
var x = (y < z) ? y : z;
等同于:
var x = y <? z;
换句话说,我想创建自己的<?
运算符。
答案 0 :(得分:38)
不,这是不可能的。您需要创建一个方法
答案 1 :(得分:28)
答案 2 :(得分:17)
正如其他答案所说,你不能创建一个新的运算符 - 至少,不是没有改变编译器内置的词法分析器和解析器。基本上,编译器的构建是为了识别像<
或?
这样的单个字符,或者像>>
或<=
这样的对象,它是一个运算符并且特别对待它;例如,它知道i<5
是表达式而不是变量名。将操作员识别为操作员是一个单独的过程,它不是决定操作员实际操作的内容,而是更紧密地集成到编译器中 - 这就是为什么你可以自定义后者而不是前者。
对于具有开源编译器(如GCC)的语言,理论上可以修改编译器以识别新的运算符。但这并不是特别容易,而且每个人都需要你的自定义编译器才能使用你的代码。
答案 3 :(得分:6)
你不仅不能这样做,而且你为什么要这样做?
我不确定你的y和z是什么类型,但是如果它们是数值类型,你可以使用:
var x = Math.Min(y, z);
虽然我个人认为,我仍然愿意:
var x = (y < z) ? y : z;
但我有点像? :junky。
好的代码不仅紧凑而且高效,而且可读。即使你是唯一一个阅读它的人,有一天你会回到那个<?
运营商那里,并想知道它到底发生了什么。
答案 4 :(得分:4)
不,但您可以创建扩展方法而不是此
y.MethodName(z)
答案 5 :(得分:2)
我很惊讶没有人提到"order of operations"
。
当编译器评估表达式时,它必须关心以正确的顺序执行操作,以使(1+2*3) = (2*3+1)
乘法总是在表达式中相同的"level"
进行加法之前发生。
覆盖和运算符时,可以更改运算符的工作方式,但不能更改编译器评估它的顺序。如果您确实创建了一个新的运算符,则无法告诉编译器相对于其他运算符评估它的顺序。因此,如果您写x <? 2 + 5
是先执行x <? 2
然后加5,还是先执行加法然后再进行x <? 7
。
答案 6 :(得分:-4)
您可以尝试重置其他运算符,例如%
或+
,以充当<?
运算符。
会很有趣