在关于Equals覆盖的msdn指南中,为什么在null检查中转换为对象?

时间:2009-11-01 20:48:37

标签: c# operator-overloading

我只看Guidelines for Overloading Equals() on msdn(见下面的代码);大部分内容对我来说很清楚,但有一条线我没有。

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

3 个答案:

答案 0 :(得分:11)

==运算符可能会被覆盖,如果是,则默认参考比较可能不是您得到的。转换为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

答案 1 :(得分:3)

我更喜欢在这个模糊的上下文中使用object.ReferenceEquals(a, b)来强制引用比较,因为它使意图清晰,同时保留语义精确地(事实上,ReferenceEquals就是这样实现的)。

答案 2 :(得分:2)

我想,因为文章还讨论了重写operator ==,它强制它使用Object上定义的==运算符而不是当前类中的任何重载运算符。