Pourquoi List implémente-t-il IList , ICollection et IEnumerable ?

Si vous allez à la définition de la List vous verrez ce qui suit:

 public class List : IList, ICollection, IEnumerable 

IList hérite déjà de ICollection et IEnumerable .

N’aurait-il pas été suffisant si List ne IList œuvre que IList ?

Oui, cela ne fait aucune différence dans ce cas. Dans certains cas, cela peut faire la différence si vous utilisez une classe de base qui implémente déjà une interface mais que vous souhaitez la réimplémenter vous-même explicitement – mais dans ce cas, il n’existe pas de classe de base (autre que l’ object implicite) qui aurait s’est comporté exactement de la même manière.

Contrairement à mes souvenirs, je ne pense pas qu’il y ait une différence dans la façon dont la classe est représentée dans les métadonnées que le code déclare explicitement toutes les interfaces ou non. Voici un exemple:

 interface IFoo {} interface IBar : IFoo {} class FooBar1 : IBar {} class FooBar2 : IBar, IFoo {} 

Ildasm et Reflector affichent la même information pour FooBar1 et FooBar2 … ils montrent tous les deux qu’ils implémentent IBar et IFoo .

En d’autres termes, nous ne pouvons pas dire si le code source d’origine pour List spécifie réellement toutes les interfaces ou non. Peut-être que oui, peut-être que non – mais cela n’a pas d’importance de toute façon.

EDIT: Pour être complet, j’ai également vérifié les cas dans lesquels vous étendez deux interfaces avec une autre interface. Je ne trouve pas non plus de différence dans les métadonnées dans ce cas. Je suis sûr que je me souviens d’une situation dans laquelle c’était évident, mais je ne la trouve pas maintenant.

Oui ce serait. IList lui-même implémente les deux autres.

L’explorateur d’objects vous montre toutes les interfaces implémentées par la classe, directement ( IList ) ou indirectement ( ICollection , IEnumerable , via IList ).

Ce n’est pas ainsi que le code a été codé en coulisse. C’est ce que des outils tels que Reflector vous montrent quand il transforme l’IL en C #.