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

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)

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

Agi*_*Jon 39

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


Dar*_*rio 31

不,但您可以在C#中重载一些现有的运算符.

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

let (<?) = min
Run Code Online (Sandbox Code Playgroud)

  • 实际上,这应该是min,而不是max;) (5认同)

Dav*_*d Z 17

正如其他答案所说,你不能创建一个新的运算符 - 至少,不是没有改变编译器内置的词法分析器和解析器.基本上,编译器的构建是为了识别单个字符,如<?,或者像>>或者一对<=,是一个操作符,并特别对待它; 例如,它知道这i<5是一个表达而不是一个变量名.将操作员识别为操作员是一个单独的过程,它决定操作员实际执行的操作,并且更紧密地集成到编译器中 - 这就是为什么您可以自定义后者而不是前者.

对于具有开源编译器(如GCC)的语言,理论上可以修改编译器以识别新的运算符.但它并不是特别容易,此外,每个人都需要您的自定义编译器来使用您的代码.


小智 6

我很惊讶没有人提到"order of operations"

当编译器对表达式求值时,它必须关注以正确的顺序执行运算,以便在表达式中(1+2*3) = (2*3+1) 乘法总是先于加法"level"

当您覆盖 and 运算符时,您可以更改运算符的作用,但不能更改编译器对其求值的顺序。如果您确实创建了一个新运算符,则无法告诉编译器以什么顺序对其进行评估。因此,如果您编写x <? 2 + 5x <? 2先执行第一个然后添加 5 还是先执行添加然后执行x <? 7.


Pau*_*per 5

你不仅不能这样做,而且你为什么要这样做?

我不确定你的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.

好的代码不仅紧凑而且高效,而且可读.即使你是唯一一个读过它的人,你<?有一天会回到那个运营商那里,想知道它到底发生了什么.

  • 我不同意.我认为在许多情况下运算符重载是有意义的.例如,如果将一个类型的两个实例一起添加是有意义的,您可能希望重载+运算符而不是创建.Add()方法.直观地,有人看到"+"并且他们理解操作员算术地将两个东西加在一起.如果那是超载有效的,那么很容易理解. (6认同)
  • 如果它是另一种语言的已知功能,如此问题请求:http://stackoverflow.com/questions/523403/can-i-define-a-perl-like-binding-operator-in-c (2认同)

Ron*_*ony 5

否,但是您可以创建扩展方法来代替

y.MethodName(z)
Run Code Online (Sandbox Code Playgroud)

  • 2.GetMin(1)很奇怪 (18认同)
  • 2.IfNotSmallEnoughThen(1):) (7认同)