为什么C#数组没有Count属性?

可能重复:
计数与集合中的长度与大小

真奇怪:

C#数组如下

double[] test = new double[1]; 

支持Length属性以获取数组的大小。 但是数组也实现了IList接口:

 IList list = test; 

但是,IList接口还提供Count属性。 为什么arrays(在这种情况下为“测试”)没有?

编辑 :感谢所有人,他们指出它实际上是提供Count属性的ICollection接口(不是IList),而且这也是由于接口的显式实现。

简单地说,他们选择将其称为Length ,并通过显式接口实现实现Count类似于:

 int ICollection.Count { get { return Length; } } 

这是关于命名的设计选择,而不是语义。

数组具有Length属性,String也是如此。

长度信号不可变:您无法添加到数组或从数组中删除。

列表和其他容器具有通常可以更改的Count属性。

哦,如果你打电话给list.Append(1.1); 你会得到一个不受支持的例外。

Arrayinheritance的类型在运行时获取IList实现 (这是可能的,不要问我):

在.NET Framework 2.0版中, Array类实现System.Collections.Generic.IListSystem.Collections.Generic.ICollectionSystem.Collections.Generic.IEnumerablegenerics接口。 这些实现在运行时提供给数组 ,因此文档构建工具不可见。 因此,通用接口不会出现在Array类的声明语法中,并且没有可通过将数组转换为通用接口类型(显式接口实现)来访问的接口成员的参考主题。 将数组转换为其中一个接口时要注意的关键是添加,插入或删除元素的成员会抛出NotSupportedException

实际上,正如Marc在他的回答中所解释的那样 , IList实现就像一个明确的实现 。 这就是为什么你可以从一个演员的结果访问IList某些成员,而不是从一个特定的T[]类型的变量。

使用显式接口声明样式隐藏Count属性,例如在类定义中这样:

 int IList.Count { get { // ...etc... } } 

您可以使用类型转换来访问隐藏的方法和属性,例如

 ((IList) myArray).Count