¿Por qué lanzar al objeto cuando se compara con nulo?

Mientras exploraba las documentaciones de MSDN en reemplazos de Equals, un punto me llamó la atención.

En los ejemplos de esta página específica , se realizan algunas comprobaciones nulas y los objetos se convierten al tipo System.Object al realizar la comparación:

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 == px) && (y == py); } 

¿Hay alguna razón específica para usar este cast o es simplemente un código “inútil” olvidado en este ejemplo?

Es posible que un tipo sobrecargue el operador ==. La conversión a objeto garantiza que se utilice la definición original.

Como han dicho otros, el tipo podría anular el operador ==. Por lo tanto, la conversión a Object es equivalente a if (Object.ReferenceEquals(p, null)) { ... } .

Creo que la conversión a System.Object lo ayudará a evitar cualquier sobrecarga de operadores que pueda tener TwoDPoint.

Es probable que exista confusión con un operador sobrecargado ==. Imagínese si el modelo no existiera y el operador == estuviera sobrecargado. Ahora la línea p == null potencialmente se uniría al operador ==. Muchas implementaciones de operator == simplemente difieren al método Equals anulado. Esto podría causar fácilmente una situación de desbordamiento de stack

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

Al realizar la conversión a Object el autor garantiza que se realizará una comprobación de referencia simple para el null (que es lo que se pretende).

Esto podría haber sido parte de una muestra más grande donde el operador == estaba sobrecargado. En ese caso, el uso de obj == null podría haber resultado en StackOverflow si se invocó TwoDPoint.Equals (objeto) como parte de la definición ==.