真奇怪:
C#数组,如下所示
double[] test = new double[1];
支持Length属性以获取数组的大小。但是数组也实现了IList接口:
IList<double> list = test;
但是,IList接口还提供了Count属性。为什么阵列(在这种情况下为“测试”)没有?
编辑:感谢所有人,他们指出它实际上是提供Count属性的ICollection接口(不是IList),而且这是由于接口的显式实现
答案 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