为什么ArrayList实现IList,ICollection,IEnumerable?

时间:2009-07-22 11:53:44

标签: c# interface

ArrayList声明它实现了IListICollectionIEnumeralbe接口。

为什么不实施IList,因为IList也来自ICollectionICollection来自IEnumerable

这种宣言的目的是什么?在.NET BCL中有很多这样的情况。

4 个答案:

答案 0 :(得分:13)

没有有效的区别。我相信额外的声明是为了清晰起见。

在Reflector中检查时,代码实现IList的类与代码声明实现所有IlistICollectionIEnumerable的类具有相同的接口声明列表

答案 1 :(得分:7)

使用以下代码:

interface I1 { }
interface I2 : I1 { }

class Foo: I2 { }

如果你通过反思看Foo,你会发现

class Foo: I2, I1 { }

哪个也适用于编译并给出相同的结果。
所以区别是没有意义的,在记录Foo时你也可以用两个接口来编写它。

另见SO问题:Why collections classes in C# (like ArrayList) inherit from multiple interfaces if one of these interfaces inherits from the remaining?

答案 2 :(得分:1)

我不确定ArrayList是否有单独的接口实现。请考虑以下代码:

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; }
}

MyClass类型仅直接实现ISub接口。但是,如果将代码编译到程序集中,然后将该程序集作为引用添加到另一个项目中,请打开对象浏览器并检查MyClass的基本类型,它将具有如下内容:

Base Types
 |- ISub
 |    |- IBase
 |- IBase
 |- Object

答案 3 :(得分:-1)

  1. IEnumerable - 支持foreach声明
  2. ICollection - 支持在arraylist中添加单个或多个项目