编译器为比较运算符生成了重载

时间:2014-07-08 15:52:34

标签: c# comparison operator-overloading

如果<>==存在运算符重载,编译器是否应该能够自动为<=>=创建?

 (a <= b) means (a < b || or a == b)
 (a >= b) means (a > b || or a == b)

至少,如果+=过载,编译器会对+执行相同的操作。

2 个答案:

答案 0 :(得分:2)

从功能的角度来看,

+=>=并不相同。

u+=2u=u+2

上的简写操作数

>=> || ==的简写。

所以你在第二种情况MoreThan() || Equal()中有2个连续的呼叫,这可能会出现像

这样的问题
  • 短路
  • 堆栈溢出
  • 该功能的返回类型可能根本不是bool(如@vcjones所述)
  • ...

但总的来说:聚合 automaticaly (在幕后)用户定义的函数永远不是一个好主意,因为最终结果不稳定,因为取决于具体的实现,所以不可预测。而且您不希望编译器生成不可预测的代码。

答案 1 :(得分:1)

不,它不能。一个原因是运营商不必返回布尔(虽然我不知道为什么有人会这样做)。例如:

    public static string operator <(Class1 a, Class1 b)
    {
        return "hello";
    }

    public static int operator >(Class1 a, Class1 b)
    {
        return "bye";
    }

编译很好,在这种情况下,编译器不能真正自动生成另一个操作符。编译器应该如何确定字符串的相反值是什么?