c# - Comprender IEquatable
(2)
1) Como dijo Ray, anule Equals(object) para garantizar la coherencia cuando se llama al método desde clases que no saben (estáticamente) que implementa IEquatable<T> . Por ejemplo, las clases de colecciones no genéricas usarán Equals(object) para las comparaciones. También debe anular GetHashCode() .
2) La implementación de IEquatable<T> no sobrecarga los operadores == y! = De forma automática, pero no hay nada que te impida hacerlo, al igual que System.String . Sin embargo, debe documentar esto muy claramente si lo hace, y tenga cuidado cuando haga comparaciones entre otros tipos de referencia (por ejemplo, MyType y Object) que seguirán usando la comparación de identidad. Sospecho que no es una gran idea hacer esto a menos que vaya a ser un tipo muy utilizado en su código, donde todos se familiaricen con él y donde el azúcar sintáctico de la sobrecarga realmente tendrá un impacto positivo en la legibilidad.
Si quiero comparar objetos e implementan la interfaz IEquatable <>, tengo algunas preguntas:
- ¿Por qué tengo que anular Igual (objeto) si tengo que implementar Equals <>
- ¿Puedo usar == y! = una vez que implemente IEquatable?
Respecto al # 1:
Desde MSDN:
Si implementa
IEquatable<T>, también debe anular las implementaciones de clase base deObject::Equals(Object)yGetHashCode()para que su comportamiento sea coherente con elIEquatable<T>::Equals. Si reemplazaObject::Equals(Object), su implementación anulada también se llama en llamadas al método estáticoEquals(System.Object, System.Object)en su clase. Esto garantiza que todas las invocaciones del métodoEquals()devuelvan resultados consistentes.
2) No, estos hacen comparaciones de referencia y no usan el método Equals.