为什么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);
你会得到一个不受支持的例外。
从Array
inheritance的类型在运行时获取IList
实现 (这是可能的,不要问我):
在.NET Framework 2.0版中,
Array
类实现System.Collections.Generic.IList
,System.Collections.Generic.ICollection
和System.Collections.Generic.IEnumerable
generics接口。 这些实现在运行时提供给数组 ,因此文档构建工具不可见。 因此,通用接口不会出现在Array
类的声明语法中,并且没有可通过将数组转换为通用接口类型(显式接口实现)来访问的接口成员的参考主题。 将数组转换为其中一个接口时要注意的关键是添加,插入或删除元素的成员会抛出NotSupportedException
。
实际上,正如Marc在他的回答中所解释的那样 , IList
实现就像一个明确的实现 。 这就是为什么你可以从一个演员的结果访问IList
某些成员,而不是从一个特定的T[]
类型的变量。
使用显式接口声明样式隐藏Count
属性,例如在类定义中这样:
int IList.Count { get { // ...etc... } }
您可以使用类型转换来访问隐藏的方法和属性,例如
((IList) myArray).Count