3

该类System.Array实现ICollection接口。这个接口有一个名为的公共属性Count,它给出了数组中元素的数量。

假设我声明一个数组并访问它的属性

Array numbers = Array.CreateInstance(typeof(int), 10);
Console.WriteLine(numbers.Count);

您会期望在屏幕上看到 10。Count但是,在数字后面加上句号后,我看不到财产。但是,有一个名为 的属性Length。为什么会这样?

更新:这是因为显式接口实现。由于还有一个和我类似的问题,我决定重新措辞。为什么要做出明确实现这一特定属性的设计决策?还有另一个具有相同功能的属性Length。那么为什么要麻烦提供显式实现Count呢?

4

4 回答 4

4

您需要将其转换为ICollection.

Array.ICollection.Count财产

该成员是显式接口成员实现。ICollection 仅当将 Array 实例强制转换为接口时才能使用它。

顺便说一句,这是重复的:我无法访问数组的 Count 属性,而是通过转换为 ICollection !

更新

这是因为显式接口实现。由于还有一个和我类似的问题,我决定重新措辞。为什么要做出明确实现这一特定属性的设计决策?还有另一个具有相同功能的属性 Length。那么为什么要麻烦提供显式实现的 Count 呢?

它继承自IList<T>which implements ICollection<T>。所以你可以问为什么数组实现IList

于 2013-02-20T09:38:29.597 回答
2

System.ArrayICollection显式地实现接口。您ICollection只能在转换Array为之后使用方法ICollection

Array numbers = Array.CreateInstance(typeof(int), 10);
ICollection numbersCollection =  (ICollection)numbers;
Console.WriteLine(numbersCollection.Count);

隐式和显式接口实现

System.Array.Count实际使用Array.Length属性

int ICollection.Count
{
    get
    {
        return this.Length;
    }
}
于 2013-02-20T09:39:36.007 回答
1

Count是从ICollection接口显式实现的。这就是为什么它是不可见的。您必须进行投射((ICollection) numbers).Count才能进入该Count物业。

于 2013-02-20T09:36:43.137 回答
1

我认为这不是编程问题,而是逻辑内涵问题。

你可能会问自己这两个问题:

Q1。数组是集合吗?

Q2。集合是数组吗?

在c#中,现有的实现告诉Q1的答案是:

A1:是的,数组是集合。因此Array实现ICollection

Q2呢?类似的问题要问一匹马是不是白马?您可能想看看 [ When a white horse is not a horse ] 来寻找答案。

对于 Q2,我会回答:“我不知道,这取决于上下文。” 那么,可能的上下文是什么?如果您将数组作为接口实现传递ICollection,那么是的,这个集合也是一个数组。但是,您可能会传递不同的对象,但具有相同接口的数组除外。那么,它一定是一个数组吗?如果您对此的某些扩展感兴趣,[此答案]中的 A3 可能会让您有所了解。

因此,它是完全合理的Array具有Length属性,也具有Count来自显式实现的属性ICollection

于 2013-02-20T12:09:25.120 回答