Aar*_*mer 59 .net c# operators
我知道你可以超载现有的运营商.我想知道是否可以创建一个新的运算符.这是我的情景.
我要这个:
var x = (y < z) ? y : z;
Run Code Online (Sandbox Code Playgroud)
相当于:
var x = y <? z;
Run Code Online (Sandbox Code Playgroud)
换句话说,我想创建自己的<?运算符.
Dar*_*rio 31
不,但您可以在C#中重载一些现有的运算符.
在其他一些语言中,如F#,您可以使用:
let (<?) = min
Run Code Online (Sandbox Code Playgroud)
Dav*_*d Z 17
正如其他答案所说,你不能创建一个新的运算符 - 至少,不是没有改变编译器内置的词法分析器和解析器.基本上,编译器的构建是为了识别单个字符,如<或?,或者像>>或者一对<=,是一个操作符,并特别对待它; 例如,它知道这i<5是一个表达而不是一个变量名.将操作员识别为操作员是一个单独的过程,它决定操作员实际执行的操作,并且更紧密地集成到编译器中 - 这就是为什么您可以自定义后者而不是前者.
对于具有开源编译器(如GCC)的语言,理论上可以修改编译器以识别新的运算符.但它并不是特别容易,此外,每个人都需要您的自定义编译器来使用您的代码.
小智 6
我很惊讶没有人提到"order of operations"。
当编译器对表达式求值时,它必须关注以正确的顺序执行运算,以便在表达式中(1+2*3) = (2*3+1) 乘法总是先于加法"level"。
当您覆盖 and 运算符时,您可以更改运算符的作用,但不能更改编译器对其求值的顺序。如果您确实创建了一个新运算符,则无法告诉编译器以什么顺序对其进行评估。因此,如果您编写x <? 2 + 5是x <? 2先执行第一个然后添加 5 还是先执行添加然后执行x <? 7.
你不仅不能这样做,而且你为什么要这样做?
我不确定你的y和z是什么类型,但如果它们是数值类型,你可以使用:
var x = Math.Min(y, z);
Run Code Online (Sandbox Code Playgroud)
虽然个人,我仍然更喜欢:
var x = (y < z) ? y : z;
Run Code Online (Sandbox Code Playgroud)
但我有点像?:junky.
好的代码不仅紧凑而且高效,而且可读.即使你是唯一一个读过它的人,你<?有一天会回到那个运营商那里,想知道它到底发生了什么.
否,但是您可以创建扩展方法来代替
y.MethodName(z)
Run Code Online (Sandbox Code Playgroud)