Chr*_*ris 9 c# arrays inheritance ilist interface
可能重复:
计数与集合中的长度与大小
真奇怪:
C#数组如下
double[] test = new double[1];
Run Code Online (Sandbox Code Playgroud)
支持Length属性以获取数组的大小.但是数组也实现了IList接口:
IList<double> list = test;
Run Code Online (Sandbox Code Playgroud)
但是,IList接口还提供Count属性.为什么阵列(在这种情况下为"测试")没有?
编辑:感谢所有人,他们指出它实际上是提供Count属性的ICollection接口(不是IList),而且这也是由于接口的显式实现.
Mar*_*ell 15
简单地说,他们选择调用它Length
,并Count
通过显式接口实现实现 - 例如:
int ICollection.Count { get { return Length; } }
Run Code Online (Sandbox Code Playgroud)
这是关于命名的设计选择,而不是语义.
数组具有Length属性,String也是如此.
长度信号不可变:您不能添加到数组或从数组中删除.
列表和其他容器具有通常可以更改的Count属性.
哦,如果你打电话, list.Append(1.1);
你会得到一个不受支持的例外.
从运行时Array
获取实现IList<T>
继承的类型(这是如何可能的,不要问我):
在 .NET Framework 2.0 版中,该类
Array
实现System.Collections.Generic.IList<T>
、System.Collections.Generic.ICollection<T>
和System.Collections.Generic.IEnumerable<T>
泛型接口。这些实现在运行时提供给数组,因此对文档构建工具不可见。因此,泛型接口不会出现在类的声明语法中Array
,并且不存在只能通过将数组强制转换为泛型接口类型(显式接口实现)才能访问的接口成员的参考主题。将数组转换为这些接口之一时要注意的关键一点是添加、插入或删除元素的成员会抛出NotSupportedException
。
实际上,正如Marc 在他的回答中所解释的那样,该实现IList<T>
就像一个显式实现。这就是为什么您可以从强制转换的结果访问 的某些成员,但不能从专门键入的变量访问。IList<T>
T[]
该Count
属性使用显式接口声明样式隐藏,例如在类定义中如下所示:
int IList.Count {
get {
// ...etc...
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用类型转换访问像这样隐藏的方法和属性,例如
((IList<double>) myArray).Count
Run Code Online (Sandbox Code Playgroud)