在浏览有关Equals覆盖的MSDN文档时,有一点引起了我的注意。
在this specific page的示例中,进行了一些空检查,并在进行比较时将对象转换为System.Object类型:
public override bool Equals(System.Object obj)
{
// If parameter is null return false.
if (obj == null)
{
return false;
}
// If parameter cannot be cast to Point return false.
TwoDPoint p = obj as TwoDPoint;
if ((System.Object)p == null)
{
return false;
}
// Return true if the fields match:
return (x == p.x) && (y == p.y);
}
是否有特定的理由使用此演员表,或者只是在这个例子中忘记了一些“无用的”代码?
答案 0 :(得分:15)
类型可能会使==运算符重载。强制转换为对象可确保使用原始定义。
答案 1 :(得分:15)
正如其他人所说,类型可能会覆盖==运算符。因此,投放到Object
等同于if (Object.ReferenceEquals(p, null)) { ... }
。
答案 2 :(得分:7)
我相信强制转换为System.Object会让你解决任何运算符重载的问题。
答案 3 :(得分:1)
可能存在以避免与重载的==运算符混淆。想象一下,如果演员表不存在且==运算符超载。现在p == null
行可能绑定到运算符==。 operator ==的许多实现只是遵循重写的Equals
方法。这很容易导致堆栈溢出情况
public static bool operator==(TwoDPoint left, TwoDPoint right) {
return left.Equals(right);
}
public override bool Equals(System.Object obj) {
...
TwoDPoint p = obj as TwoDPoint;
if ( p == null ) { // Stack overflow!!!
return false;
}
...
}
通过转换为Object
,作者可确保对null
进行简单的参考检查(这是预期的)。
答案 4 :(得分:0)
这可能是==运算符过载的较大样本的一部分。在这种情况下,如果在==定义中调用TwoDPoint.Equals(object),则使用obj == null可能导致StackOverflow。