【问题标题】:C# overloading operator==: Return something else than boolC# 重载 operator==:返回 bool 以外的其他内容
【发布时间】:2017-11-21 09:23:04
【问题描述】:

我正在编写一个类库来使用牛顿法求解非线性方程。我偶然发现了运算符重载,并考虑过重载 ==-Operator。像expression1 == expression2 这样的东西将解决方案返回为Constant,它基本上是System.Double 的包装类:

public static Constant operator ==(Derivable d1, Derivable d2)
{
    return d1.Equal(d2);
}

虽然它编译得非常好并且工作正常,但我问自己是否可以合理的设计选择重载 ==-Operator 以返回两个对象的相等性以外的东西作为 bool,尤其是因为你还必须重载!=-Operator。这是不好的做法吗?我是否应该只使用我的方法Equal

【问题讨论】:

  • 这几乎是糟糕的做法。如果你想返回一个双精度,定义你自己的方法,创建一个继承自双精度的抽象类并在那里实现它,或者创建一个扩展方法,但是重载运算符来做他们不应该做的事情..想象一下开发人员实现库并在 equals 上获得意外行为...
  • 我会说这是一个基于意见的问题......但我个人会觉得如果我在两个对象上执行== 时它不会是bool 会很混乱。至少它应该是隐式转换为 bool
  • 我个人建议不要这样做。
  • @DamienFlury 忘记了,好吧,所以类具有内部双值,实现一切 - 相同的结果 ;)
  • 数学家....总是试图使事情过于复杂

标签: c# operator-overloading principles


【解决方案1】:

作为一名开发人员,我建议不要覆盖== Operator (C# Reference)

对于预定义的值类型,相等运算符 (==) 在以下情况下返回 true 其操作数的值相等,否则为假。以供参考 字符串以外的类型,如果两个操作数引用 ==,则返回 true 同一个对象。对于字符串类型,== 比较 字符串。

我无法想象您想要覆盖此行为的场景。如果您正在使用类,那么您可以覆盖Object.Equals Method (Object)

如果您正在与其他开发人员合作,这可能会非常令人困惑。

【讨论】:

  • 我也建议重载 Equals 方法: 1. 它不起作用,OP 想要返回 Constant,而不是 bool . 2. 论点“不要重写一个方法来做完全不同于它原本打算做的事情”适用于Equals.以及==。 OP 不想比较这两个表达式,而是求解方程a = b。所以Equals是错误的方法。
猜你喜欢
  • 2012-10-21
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多