是否可以在c#中创建一个新的运算符?

时间:2009-06-24 18:32:23

标签: c# .net operators

我知道您可以重载现有的运营商。我想知道是否可以创建一个新的运算符。这是我的情景。

我想要这个:

var x = (y < z) ? y : z;

等同于:

var x = y <? z;

换句话说,我想创建自己的<?运算符。

7 个答案:

答案 0 :(得分:38)

不,这是不可能的。您需要创建一个方法

答案 1 :(得分:28)

不,但您可以在C#中重载some existing operators

在其他一些语言中,例如F#,您可以使用:

let (<?) = min

答案 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)

您可以尝试重置其他运算符,例如%+,以充当<?运算符。

会很有趣