System.Array
类实现ICollection
接口。
此接口有一个名为Count
的公共属性,它提供了数组中元素的数量。
假设我声明了一个数组并访问其属性
Array numbers = Array.CreateInstance(typeof(int), 10);
Console.WriteLine(numbers.Count);
你可能会在屏幕上看到10。
但是,在数字之后放一段时间后,我无法看到Count
属性。但是,有一个名为Length
的属性。为什么会这样?
更新:
这是因为显式接口实现。由于还有另一个类似于我的问题,我决定重新说出来。
为什么要明确实现这个特定属性的设计决策?还有另一个具有相同功能Length
的属性。那么为什么要解决提供明确实现的Count
?
答案 0 :(得分:4)
您需要将其投射到ICollection
。
此成员是显式接口成员实现。有可能 仅在将Array实例强制转换为
ICollection
时使用 接口
顺便说一下,这是一个副本:I can not access Count property of the array but through casting to ICollection !
更新:
这是因为显式接口实现。既然有 另一个类似于我的问题,我决定重新说出来。为什么是 设计决定明确实施这一特定 属性?还有另一个具有相同功能的属性 长度。那么为什么要经历明确提供的麻烦呢? 实施了Count?
它从实现IList<T>
的{{1}}继承。所以你可以问why array implements IList
?
答案 1 :(得分:2)
System.Array
类显式实现ICollection
接口。
只有在ICollection
投放到Array
ICollection
的方法
Array numbers = Array.CreateInstance(typeof(int), 10);
ICollection numbersCollection = (ICollection)numbers;
Console.WriteLine(numbersCollection.Count);
Implicit and Explicit Interface Implementations
System.Array.Count
实际使用Array.Length
属性
int ICollection.Count
{
get
{
return this.Length;
}
}
答案 2 :(得分:1)
Count
是从ICollection
接口明确实现的。这就是为什么它是隐形的。您必须投射((ICollection) numbers).Count
才能访问Count
属性。
答案 3 :(得分:1)
我认为这不是编程问题,而是逻辑问题intension。
你可能会问自己这两个问题:
<强> Q1 即可。是数组集合吗?
<强> Q2 即可。是集合数组吗?
在c#中,现有的实现告诉我们Q1的答案是:
A1 :是的,数组是集合。因此Array
实现ICollection
。
Q2怎么样?这是一个类似的问题要求 是一匹马白马 ?你可能想看一下[When a white horse is not a horse]的答案。
使用Q2,我会回复: “我不知道,这是根据上下文。”
那么,可能的背景是什么?如果您传递一个数组作为接口实现ICollection
,那么是的,这个集合也是一个数组。但是,除了具有相同接口的数组之外,您可能会传递另一个对象。那么,它一定是一个阵列吗?如果您对某些扩展感兴趣,[this answer]中的A3可能会让您知道。
因此,完全合理,Array
具有Length
属性,并且Count
属性来自ICollection
的显式实现。