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

时间:2011-01-22 19:13:05

标签: c# arrays inheritance interface ilist

  

可能重复:
  count vs length vs size in a collection

真奇怪:

C#数组,如下所示

double[] test = new double[1];

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

IList<double> list = test;

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

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

4 个答案:

答案 0 :(得分:14)

简单地说,他们选择将其称为Length,并通过显式接口实现实现Count - 如下所示:

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

答案 1 :(得分:7)

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

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

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

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

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

答案 2 :(得分:4)

继承自Array obtain implementations of IList<T> at run-time的类型(这是可能的,不要问我):

  

在.NET Framework 2.0版中,   Array类实现了   System.Collections.Generic.IList<T>,   System.Collections.Generic.ICollection<T>,   和   System.Collections.Generic.IEnumerable<T>   通用接口。的的   实现被提供给数组   在运行时,因此不是   对文档构建可见   工具。结果,通用   接口不会出现在   Array的声明语法   上课,并没有参考   接口成员的主题   只能通过将数组转换为   通用接口类型(显式   接口实现)。钥匙   当你施展时要注意的事情   数组到这些接口之一是   添加,插入或的成员   删除元素抛出   NotSupportedException

实际上,IList<T>实施就像explicit implementation一样,在他的回答中就像Marc explained一样。这就是为什么你可以从演员的结果中访问IList<T>的某些成员,而不是从T[]特定的变量中访问{。}}。

答案 3 :(得分:3)

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

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

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

((IList<double>) myArray).Count