La méthode d'extension ToList()
renvoie un List<TSource>
. Suivant le même schéma, ToDictionary()
renvoie un Dictionary<TKey, TSource>
.
Je suis curieux de savoir pourquoi ces méthodes ne sont pas de type de leurs valeurs de retour en tant que IList<TSource>
et IDictionary<TKey, TSource>
respectivement. Cela semble même étrangeté parce qu' ToLookup<TSource, TKey>
types de sa valeur de retour comme une interface au lieu d'une mise en œuvre effective.
En regardant la source de ces méthodes d'extension à l'aide de dotPeek ou d'autres decompiler, nous voyons la suite de la mise en œuvre (montrant ToList()
parce que c'est plus court):
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) {
if (source == null) throw Error.ArgumentNull("source");
return new List<TSource>(source);
}
Alors pourquoi ce type de méthode de sa valeur de retour comme une mise en œuvre spécifique de l'interface et non pas l'interface elle-même? Le seul changement serait le type de retour.
Je suis curieux parce que l' IEnumerable<>
extensions sont très cohérents dans leurs signatures, à l'exception de ces deux cas. J'ai toujours pensé que c'est un peu étrange.
En outre, pour rendre les choses encore plus confuses, la documentation pour ToLookup()
membres de:
Crée une liste de choix à partir d'un IEnumerable selon un clé spécifiée sélecteur de fonction.
mais le type de retour est - ILookup<TKey, TElement>
.
Dans Edulinq, Jon Skeet mentionne que le type de retour est - List<T>
au lieu de IList<T>
, mais ne touche pas le sujet.
Vaste de la recherche a donné aucune réponse, donc ici je vous demande:
Est-il une décision de conception derrière pas taper les valeurs de retour comme les interfaces, ou est-ce juste un hasard?