【发布时间】:2012-06-03 03:48:15
【问题描述】:
下面的代码
public struct Person
{
public int ID;
public static bool operator ==(Person a, Person b) { return a.Equals(b); }
public static bool operator !=(Person a, Person b) { return !a.Equals(b); }
}
为什么编译器会给我这些警告?
不定义下面的方法有什么问题?
warning CS0660: 'Person' defines operator == or operator != but
does not override Object.Equals(object o)
warning CS0661: 'Person' defines operator == or operator != but
does not override Object.GetHashCode()
【问题讨论】:
-
我认为你是对的。
==和!=运算符将不存在(它是struct!)如果没有您定义它们。另一方面,显然,您将它们定义为与ValueType.Equals(Object)的行为完全相同。因此,在不更改该方法的情况下覆盖该方法看起来会很奇怪。然而,编译器并没有意识到(也不检查)你的==实现的主体完全等同于Equals,我想。 -
@JeppeStigNielsen:是的,我一开始也是这么想的,但后来我想:即使我确实覆盖了
Equals(即编译器不能'不验证==的正文),所以这不可能是原因...... -
警告不是由一个非常聪明的人发出的。你知道,我看到人们覆盖(和改变)
Equals而不覆盖GetHashCode。编译器会警告他们。好的!然后他们在 VS 中输入:override Ge,他们会看到他们选择的完成。编辑为他们写了:public overide int GetHashCode() { return base.GetHashCode(); }编译器不再警告 :-( 他们继续发送代码...
标签: c# warnings equals equals-operator