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

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)

  • 来自我的+1,但我猜他们可能正在寻找"为什么"部分的答案? (2认同)

Hen*_*man 8

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

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

长度信号不可变:您不能添加到数组或从数组中删除.

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

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

  • 长度决不是信号不可变的; `MemoryStream`(实际上,很多流实现),`StringBuilder`等 (10认同)

Dan*_*Tao 5

从运行时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[]


Jon*_*ant 5

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

int IList.Count {
    get {
        // ...etc...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

((IList<double>) myArray).Count
Run Code Online (Sandbox Code Playgroud)

  • IList 实际上并没有定义 Count;ICollection 确实 (5认同)