В руководстве msdn по переопределению Equals, почему приведение к объекту в нулевой проверке? - PullRequest
4 голосов
/ 01 ноября 2009

Я только что посмотрел Руководство по перегрузке Equals () в 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 ]

11 голосов
/ 01 ноября 2009

Оператор == может быть переопределен, и если это так, сравнение ссылок по умолчанию может быть не тем, что вы получаете. Приведение к 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
3 голосов
/ 02 ноября 2009

Я предпочитаю использовать object.ReferenceEquals(a, b) в этом неоднозначном контексте для принудительного сравнения ссылок, потому что это проясняет намерение при сохранении семантики точно (на самом деле, ReferenceEquals реализован таким образом).

2 голосов
/ 01 ноября 2009

Полагаю, поскольку в статье также говорится о переопределении оператора ==, он заставляет его использовать оператор ==, определенный для объекта, а не какой-либо перегруженный оператор в текущем классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...