2009-07-24 7 views
6

Si uno llama el método .Max() extensión en un IEnumerable<T>, y los objetos dentro de no aplicar IComparable, uno tiene System.ArgumentException: At least one object must implement IComparable.¿Por qué IEnumerable <T> .Max no obliga a ser IComparable?

¿Por qué no Max y métodos similares constriñen T para implementar IComparable, por lo que este problema puede ser capturado en tiempo de compilación en lugar de en tiempo de ejecución?

+0

Mientras escribía la pregunta pensé en una respuesta, pero aun así pensé que valía la pena preguntar. –

Respuesta

6

Supongo que porque es más flexible. Por ejemplo, puede tener un IEnumerable<object> que contenga cadenas, en cuyo caso Max() se puede llamar con bastante seguridad, a pesar de que el tipo Object no implementa IComparable.

+6

Un aspecto difícil de muchos problemas de diseño es decidir cómo equilibrar el dolor de un sistema robusto con un requisito engorroso contra el dolor de un sistema flexible que puede fallar en el tiempo de ejecución. En este caso particular, los diseñadores optaron por flexibilidad sobre robustez; si esa fue la opción correcta es ciertamente discutible, pero hubo que hacer alguna elección y ninguna opción fue perfecta. –

+1

@Eric: +1, pero me gustaría haber publicado una respuesta para poder aceptarla. –

8

Las comparaciones son ... divertidas. En primer lugar, tiene una opción de IComparable<T> o IComparable - ¿cuál elegiría? Actualmente (a través de Comparer<T>.Default) es compatible con ambos, pero no existe "esta o esa" restricción genérica.

Luego aparece el problema de Nullable<T>; esto tiene comparaciones "levantadas", por lo que si es comparable o no depende del T; pero de nuevo, Comparer<T>.Default se ocupa de esto para nosotros (Nullable<T> no implementa ni IComparable ni IComparable<T>).

Plus; ahorra en la propagación de restricción genérica; tan pronto como tenga una restricción como esta en el código de la biblioteca, infectará rápidamente todo el código de llamadas en sentido ascendente, lo que lo convertirá en un duro trabajo.

+0

Una respuesta perspicaz. Obtiene mi +1 por ahora, no aceptará aún, ya que no quiero desalentar otras respuestas. –

Cuestiones relacionadas