2009-07-24 5 views
6

Si l'on appelle la méthode d'extension .Max() sur un IEnumerable<T>, et les objets à l'intérieur ne mettent pas en œuvre IComparable, on obtient System.ArgumentException: At least one object must implement IComparable.Pourquoi IEnumerable <T> .Max ne peut-il pas être IComparable?

Pourquoi ne pas Max et des méthodes similaires contraignent T à mettre en œuvre IComparable, de sorte que ce problème peut être pris à la compilation au lieu de l'exécution?

+0

En écrivant la question j'ai pensé à une réponse, mais j'ai quand même pensé que ça valait la peine de demander. –

Répondre

6

Je suppose que c'est plus flexible. Par exemple, vous pouvez avoir un IEnumerable<object> qui contient des chaînes, auquel cas Max() peut être appelé en toute sécurité, même si le type Object n'implémente pas IComparable.

+6

Un aspect difficile de nombreux problèmes de conception est de décider comment équilibrer la douleur d'un système robuste avec une exigence lourde contre la douleur d'un système flexible qui peut échouer à l'exécution. Dans ce cas particulier, les concepteurs ont opté pour la flexibilité plutôt que la robustesse; La question de savoir si c'était le bon choix est certainement discutable, mais il fallait faire un choix et aucune des deux options n'était parfaite. –

+1

@Eric: +1, mais j'aurais aimé que vous répondiez pour que je puisse l'accepter. –

8

Les comparaisons sont ... amusantes. Premièrement, vous avez le choix entre IComparable<T> ou IComparable - lequel choisiriez-vous? Actuellement (via Comparer<T>.Default), il prend en charge les deux, mais il n'y a pas "cette ou que" contrainte générique.

Ensuite, vous obtenez le numéro de Nullable<T>; cela a "levé" des comparaisons, donc si elle est comparable ou non dépend de la T; mais encore une fois, Comparer<T>.Default traite de cela pour nous (Nullable<T> implémente ni IComparable ni IComparable<T>).

Plus; il économise sur la propagation de contraintes génériques; dès que vous avez une contrainte comme celle-ci dans le code de la bibliothèque, il infecte rapidement tout le code d'appel en amont, ce qui en fait un dur labeur.

+0

Une réponse perspicace. Obtient mon +1 pour le moment, ne l'acceptera pas encore car je ne veux pas décourager les autres réponses. –

Questions connexes