'派生'定义运算符==或运算符!=,但不覆盖Object.Equals(object o)

时间:2019-01-10 21:55:51

标签: c#

考虑:

  class Base : IEquatable<Base> {
    public bool Equals(Base other) => false;
    public override bool Equals(Object o) => false;
    public override int GetHashCode() => 0;
    public static bool operator ==(Base o1, Base o2) => Equals(o1, o2);
    public static bool operator !=(Base o1, Base o2) => !Equals(o1, o2);
  }

  class Derived : Base {
    public static bool operator ==(Derived o1, Derived o2) => Equals(o1, o2);
    public static bool operator !=(Derived o1, Derived o2) => !Equals(o1, o2);
  }

我得到:

Warning CS0660  'Derived' defines operator == or operator != but does not override Object.Equals(object o)
Warning CS0661  'Derived' defines operator == or operator != but does not override Object.GetHashCode()

这些警告对我来说是错误的-当我从Base继承重写的Equals(object)GetHashCode()时,代码应该没有任何警告。

此外,没有什么好办法-

我可以在Derived中实现丑陋且多余的功能

我可以添加#pragma warning disable CS0660, CS0661,但这将禁用文件中所有位置的警告,不仅限于安全派生函数的位置。

这是对C#编译器的监督,还是有充分的理由呢? 有没有一种干净的方法?

1 个答案:

答案 0 :(得分:1)

计算科学通常涉及权衡。

这里要权衡的是考虑更可能的错误。

有人忘记添加这些方法的可能性更大吗?还是更有可能有人从另一个类继承而来,有意将实现保留在基类之外?

我怀疑他们看着这两个,并认为“嗯,第一种情况更有可能”-因此他们针对该情况进行了优化。

鉴于这是一个警告,请按以下方式处理-如果您不同意,则只需禁用(在本地或在整个项目范围内)警告。这不是错误。