考虑:
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#编译器的监督,还是有充分的理由呢? 有没有一种干净的方法?
答案 0 :(得分:1)
计算科学通常涉及权衡。
这里要权衡的是考虑更可能的错误。
有人忘记添加这些方法的可能性更大吗?还是更有可能有人从另一个类继承而来,有意将实现保留在基类之外?
我怀疑他们看着这两个,并认为“嗯,第一种情况更有可能”-因此他们针对该情况进行了优化。
鉴于这是一个警告,请按以下方式处理-如果您不同意,则只需禁用(在本地或在整个项目范围内)警告。这不是错误。