Ответ 1
Возможно, что тип перегружает оператор ==. Приведение к объекту гарантирует, что используется исходное определение.
Во время просмотра документации MSDN по переопределению Equals одна точка привлекла мое внимание.
На примерах этой конкретной страницы, выполняются некоторые нулевые проверки, а объекты выполняются в тип 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);
}
Есть ли конкретная причина для использования этого акта, или это просто какой-то "бесполезный" код, забытый в этом примере?
Возможно, что тип перегружает оператор ==. Приведение к объекту гарантирует, что используется исходное определение.
Как говорили другие, тип может переопределить оператор ==. Поэтому приведение к Object
эквивалентно if (Object.ReferenceEquals(p, null)) { ... }
.
Я считаю, что приведение в System.Object приведет вас к любой перегрузке оператора, которую может иметь TwoDPoint.
Вероятно, существует вероятность избежать путаницы с перегруженным оператором ==. Представьте себе, что листинг не существует, а оператор == был перегружен. Теперь строка 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;
}
...
}
Отбрасывая на Object
, автор обеспечивает простую контрольную проверку для null
(это то, что предназначено).
Это могло быть частью более крупной выборки, где оператор == был перегружен. В этом случае использование obj == null могло привести к StackOverflow, если в качестве определения определения == был использован TwoDPoint.Equals(object).