代码之家  ›  专栏  ›  技术社区  ›  Aaron Palmer

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

  •  58
  • Aaron Palmer  · 技术社区  · 17 年前

    我知道你可以让现有的操作员超负荷工作。我想知道是否有可能创建一个新的操作员。这是我的设想。

    我想要这个:

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

    与此等效:

    var x = y <? z;
    

    换句话说,我想创造我自己的 <?

    7 回复  |  直到 17 年前
        1
  •  42
  •   AgileJon    17 年前

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

        2
  •  31
  •   Aaron Franke    8 年前

    不,但是你可以超载 some existing operators

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

    let (<?) = min
    
        3
  •  19
  •   David Z    17 年前

    正如其他答案所说,你不能创建一个新的操作符——至少,不改变编译器中内置的词法分析器和解析器是不行的。基本上,编译器是用来识别像 < ? >> <= i<5 例如,是表达式而不是变量名。将运算符识别为运算符与确定运算符实际执行的操作是一个独立的过程,并且与编译器的集成度更高,这就是为什么可以自定义后者而不能自定义前者。

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

        4
  •  8
  •   Paul Hooper    17 年前

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

    我不确定y和z是什么类型,但如果它们是数值类型,您可能可以使用:

    var x = Math.Min(y, z);
    

    尽管就我个人而言,我还是更愿意:

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

    但我有点像一个:垃圾。

    <? 有一天接线员想知道这到底是怎么回事。

        5
  •  6
  •   Hari_pb    8 年前

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

    当编译器对表达式求值时,它必须关注以正确的顺序执行操作,以便 (1+2*3) = (2*3+1) "level" 在表达式中。

    重写and运算符时,可以更改运算符的操作,但不能更改编译器对其求值的顺序。如果您确实创建了一个新的运算符,则无法告诉编译器相对于其他运算符的求值顺序。所以如果你写 x <? 2 + 5 你会表演吗 x <? 2 x <? 7 .

        6
  •  5
  •   Rony    17 年前

    y.MethodName(z)
    
        7
  •  -4
  •   Patrick Hofman Wahid Bitar    12 年前

    您可以尝试重载其他操作员,如 % + 充当 <? 操作人员