c# compareto

interface icomparable c#



Anular CompareTo: ¿Qué hacer con un caso nulo? (4)

¿Qué se debe devolver en un método CompareTo cuando el objeto dado es null ?

La biblioteca de MSDN muestra un ejemplo donde se devuelve 1 . Pero habría esperado lanzar un error porque compararlo con null no es posible.

Espero diferentes opiniones a esta respuesta. ¿Cuál podría ser un enfoque de mejores prácticas?


El argumento CompareTo con nulo afecta el caso al ordenar una lista con elementos nulos. Al devolver 1 cuando el objeto dado es nulo, aparece nulo en la parte superior de la lista cuando se ordena, que es el comportamiento más popular.


La decisión es tuya. No está más allá del ámbito de la posibilidad imaginar un caso de uso válido en el que compararía algo con nada y quisiera que "algo" fuera visto como mayor. Pero es por eso que lo estás anulando, para que puedas decidir cómo quieres manejar ese caso.


La mejor práctica dependería de su caso particular: la comparación con el null podría ser posible dependiendo del objeto que esté comparando.

Si defino mi objeto de modo que null sea ​​el valor más bajo posible para cualquier comparación, entonces es claramente posible comparar con null y tiene un resultado bien definido. En otros casos, lanzar una excepción puede tener más sentido.

En última instancia, esta es una pregunta de diseño (bastante subjetiva), a la que no hay necesariamente una respuesta.


Sí, hay una mejor práctica. Contrariamente a lo que dicen las otras respuestas, existe un estándar esperado, no solo el comportamiento más popular.

La respuesta correcta se encuentra en la documentación de MSDN para IComparable<T>.CompareTo y IComparable.CompareTo :

Por definición, cualquier objeto compara mayor que nulo , y dos referencias nulas se comparan iguales entre sí.

(Contractualmente, comparando mayor se define como: si a > b entonces a.CompareTo(b) > 0 ).

Este comportamiento esperado también se confirma, por ejemplo, en Nullable.Compare<T> . Nulo siempre se compara como menos que un valor.

También vale la pena señalar que para la comparación no genérica, los tipos no coincidentes no deben tratarse como nulos:

El parámetro, obj , debe ser del mismo tipo que el tipo de clase o valor que implementa esta interfaz; de lo contrario, se lanza una ArgumentException.


Esto no afecta su pregunta, pero tenga en cuenta que los Nullable<T> comparison operators ( == Nullable<T> comparison operators != , < , <= , > , >= ) No siguen la convención de IComparable .

Cuando realiza comparaciones con tipos anulables, si el valor de uno de los tipos anulables es nulo y el otro no, todas las comparaciones se evalúan como false excepción de != (No igual). Es importante no asumir que debido a que una comparación particular devuelve false , el caso opuesto devuelve true . En el siguiente ejemplo, 10 no es mayor que, menor que, ni igual a nulo. Sólo num1 != num2 evalúa como true .

También está el resultado impar de que (int?)null == (int?)null evalúa como verdadero pero (int?)null <= (int?)null no.