C# 在关于Equals override的msdn指南中,为什么在null检查中强制转换为对象?

C# 在关于Equals override的msdn指南中,为什么在null检查中强制转换为对象?,c#,operator-overloading,C#,Operator Overloading,我只是在看(见下面的代码);大部分对我来说都很清楚,但有一句话我不明白 if ((System.Object)p == null) 或者,在第二个覆盖中 if ((object)p == null) 为什么不简单 if (p == null) 我们的演员阵容是什么? public override bool Equals(System.Object obj) { // If parameter is null return false. if (obj == null)

我只是在看(见下面的代码);大部分对我来说都很清楚,但有一句话我不明白

if ((System.Object)p == null)
或者,在第二个覆盖中

if ((object)p == null)
为什么不简单

 if (p == null)
我们的演员阵容是什么?

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

public bool Equals(TwoDPoint p)
{
    // If parameter is null return false:
    if ((object)p == null)
    {
        return false;
    }

    // Return true if the fields match:
    return (x == p.x) && (y == p.y);
}

我想,由于本文还讨论了重写运算符==,它迫使它使用对象上定义的==运算符,而不是当前类中任何重载的运算符。

可以重写
=
运算符,如果是,则默认的引用比较可能不是您得到的。强制转换到System.Object可确保调用
==
执行引用相等性测试

public static bool operator ==(MyObj a, MyObj b)
{
  // don't do this!
  return true;
}

...
MyObj a = new MyObj();
MyObj b = null;
Console.WriteLine(a == b); // prints true
Console.WriteLine((object)a == (object)b); // prints false

我更喜欢在这个模棱两可的上下文中使用
object.ReferenceEquals(a,b)
来强制进行引用比较,因为它在准确保留语义的同时明确了意图(事实上,
ReferenceEquals
就是这样实现的)