11

可能重复:
集合中的计数、长度和大小

真的很奇怪:

C#数组如下

double[] test = new double[1];

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

IList<double> list = test;

但是,IList 接口还提供了一个 Count 属性。数组(在这种情况下为“测试”)怎么没有?

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

4

4 回答 4

18

简单地说,他们选择调用它Length,并Count通过显式接口实现来实现——比如:

int ICollection.Count { get { return Length; } }
于 2011-01-22T19:16:46.030 回答
9

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

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

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

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

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

于 2011-01-22T19:16:39.687 回答
5

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

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

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

((IList<double>) myArray).Count
于 2011-01-22T19:18:46.510 回答
4

从运行时Array 获取实现的IList<T>类型继承(这怎么可能,不要问我):

在 .NET Framework 2.0 版中, Array该类实现 System.Collections.Generic.IList<T>System.Collections.Generic.ICollection<T>System.Collections.Generic.IEnumerable<T> 泛型接口。这些实现在运行时提供给数组,因此对文档构建工具不可见。因此,泛型接口不会出现在Array 类的声明语法中,并且没有接口成员的参考主题,只能通过将数组转换为泛型接口类型(显式接口实现)才能访问这些成员。将数组强制转换为这些接口之一时要注意的关键是添加、插入或删除元素的成员 throw NotSupportedException

实际上,正如Marc在他的回答中所解释的那样,该IList<T>实现就像一个显式实现。这就是为什么您可以从强制转换的结果而不是从特定类型的变量中访问某些成员的原因。IList<T>T[]

于 2011-01-22T19:17:18.303 回答