¿Por qué ArrayList implementa IList, ICollection, IEnumerable?

ArrayList declara que implementa las interfaces IList , ICollection e IEnumeralbe .

¿Por qué no solo implementar IList , porque IList también se deriva de ICollection , e ICollection se deriva de IEnumerable ?

¿Cuál es el propósito de este tipo de statement? Hay muchos casos como este en .NET BCL.

Con el siguiente código:

 interface I1 { } interface I2 : I1 { } class Foo: I2 { } 

Si miras a Foo a través de la reflexión encontrarás

 class Foo: I2, I1 { } 

Lo cual también es válido para comstackr y da el mismo resultado.
Así que la diferencia es discutible, y al documentar a Foo puede escribirlo con ambas interfaces.

Consulte también la pregunta SO: ¿Por qué las clases de colecciones en C # (como ArrayList) heredan de múltiples interfaces si una de estas interfaces se hereda del rest?

No hay diferencia efectiva. Creo que las declaraciones adicionales están ahí para mayor claridad.

Cuando se verifica en Reflector, las clases que en el código implementan IList tienen la misma lista de statement de interfaz que las clases que en el código declaran implementar todo Ilist , ICollection e IEnumerable .

No estoy tan seguro de que ArrayList tenga implementaciones separadas de las interfaces. Considere el siguiente código:

 public interface IBase { int SomeInt { get; set; } } public interface ISub : IBase { int SomeOther { get; set; } } public class MyClass : ISub { public int SomeOther { get; set; } public int SomeInt { get; set; } } 

El tipo MyClass implementa solo la interfaz ISub directamente. Sin embargo, si comstack el código en un ensamblaje y luego agrega ese ensamblaje como referencia en otro proyecto, abra el Examinador de objetos y examine los tipos básicos de MyClass , presentará algo como esto:

 Base Types |- ISub | |- IBase |- IBase |- Object 
  1. IEnumerable – Para soportar la sentencia foreach
  2. ICollection – Para admitir agregar un solo elemento o varios en el arraylist