C# 为什么在与null比较时强制转换为object?

C# 为什么在与null比较时强制转换为object?,c#,.net,casting,comparison,null,C#,.net,Casting,Comparison,Null,在浏览关于Equals覆盖的MSDN文档时,有一点引起了我的注意 在的示例中,进行了一些空检查,并在进行比较时将对象强制转换为System.Object type: public override bool Equals(System.Object obj) { // If parameter is null return false. if (obj == null) { return false; } // If parameter

在浏览关于Equals覆盖的MSDN文档时,有一点引起了我的注意

在的示例中,进行了一些空检查,并在进行比较时将对象强制转换为System.Object type:

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);
}

是否有使用此强制转换的特定原因,或者它只是本例中忘记的一些“无用”代码?

我相信强制转换到System.Object将使您绕过TwoDPoint可能具有的任何运算符重载。

类型可能会重载==运算符。cast to对象确保使用原始定义。

这可能是==运算符重载的较大示例的一部分。在这种情况下,如果在==定义中调用TwoDPoint.Equals(object),则使用obj==null可能会导致堆栈溢出。

正如其他人所说,该类型可能会覆盖==运算符。因此,强制转换到
Object
相当于
if(Object.ReferenceEquals(p,null)){…}

它的存在可能是为了避免与重载==运算符混淆。想象一下,如果强制转换不存在,并且==运算符重载。现在,
p==null
行可能会绑定到操作符==。运算符==的许多实现只是遵从重写的
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;
    }

    ...
}

通过强制转换到
对象
,作者可以确保对
null
进行简单的引用检查(这是预期的)。

+1使用ReferenceEquals比强制转换到对象+1对我来说更清楚。使用ReferenceEquals可以更清楚地显示意图。