C# C中的Array.ICollection.Count属性#

C# C中的Array.ICollection.Count属性#,c#,.net,C#,.net,为什么Count属性是System.Array中的显式接口实现 string[] a = new string[0]; int countAsArray = a.Count; // compile error int countAsIList = ((ICollection<string>)a).Count; // success string[]a=新字符串[0]; int countAsArray=a.Count;//编译错误 int countAsIL

为什么Count属性是System.Array中的显式接口实现

    string[] a = new string[0];
    int countAsArray = a.Count; // compile error
    int countAsIList = ((ICollection<string>)a).Count; // success
string[]a=新字符串[0];
int countAsArray=a.Count;//编译错误
int countAsIList=((ICollection)a).Count;//成功

可能是因为确定数组中项数的更常见方法是属性。同时拥有
Count
Length
会有点混乱。

如果你已经有了一个数组,你不需要调用
array.Count
,因为已经有
array.Length
做同样的事情了。如果
Count
Length
都是直接可用的,我们将得到关于使用哪一个的毫无意义的讨论。

很可能是因为数组已经具有1.0版本中具有相同含义的Length属性

编辑:

正如前面指出的,1.0已经有了ICollection接口(,所以我最初猜测中的1.0引用不太可能有效。另一个可能的原因是,已有足够多的语言/库将Length属性用于数组的长度


在。

上有关于该主题的有趣评论,可能是因为已经有一个Length属性可以做同样的事情。因此,出于性能原因,他们希望您使用Length而不是Count,而Count只做wrap Length。显式实现是为了能够与列表进行互操作其他类似的东西。

数组已经有了
.Length
属性。将
.Count
作为一个显式实现隐藏了重复的功能。

因为数组使用
Length
?一般来说,我认为你的做法是对的,但这更多的是设计驱动的决策,而不是性能驱动的决策。我接受g这是因为它提到了1.0版本,我认为向后兼容性是这个设计决策的关键。如果他们再次这样做,他们可能只有System.Array上的.Count属性和no.Length属性。事实上,我认为他们应该考虑将IList.Count属性命名为IList.Length。@zooone9243
ICollection
也是从.NET 1.0开始就存在的。我不完全确定向后兼容性在哪里。@vcsjones是1.1,不是1.0。我找不到1.0的参考,但我想知道同样的事情。@hvd几乎不可能找到1.0左右的任何文档;但是for
ICollection
ind声明它存在于.NET 1.0中。如果这种变化发生在1.0和1.1之间,我会非常惊讶。@zooone9243因为数组是有长度的,集合可能没有长度。例如,集合可以是集合或树;它们本质上不是线性的。