Why does C# array not have Count property? [duplicate]

与世无争的帅哥 提交于 2019-12-08 15:59:14

问题


Possible Duplicate:
count vs length vs size in a collection

Really strange:

C# arrays such as the following

double[] test = new double[1];

support the Length property to get the size of the array. But arrays also implement an IList interface:

IList<double> list = test;

However, the IList interface provides also a Count property. How come the array ("test" in this case) doesn't?

Edit: Thanks to all of you who pointed out that it is in fact the ICollection interface (not IList) which provides the Count property, and also that this is due to explicit implementation of the interface.


回答1:


Simply, they chose to call it Length, and implement Count via explicit interface implementation -something like:

int ICollection.Count { get { return Length; } }



回答2:


It was a design choice about Naming, not semantics.

Arrays have a Length property, as does the String.

Length signals immutable: You cannot Add to or Remove from an array.

Lists and other containers have a Count property that can usually change.

Oh, and if you call list.Append(1.1); you will get a not supported exception.




回答3:


The Count property is hidden using the explicit interface declaration style, for example like this in a class definition:

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

You can access methods and properties hidden like this using a type cast, e.g.

((IList<double>) myArray).Count



回答4:


Types inheriting from Array obtain implementations of IList<T> at run-time (how this is possible, don't ask me):

In the .NET Framework version 2.0, the Array class implements the System.Collections.Generic.IList<T>, System.Collections.Generic.ICollection<T>, and System.Collections.Generic.IEnumerable<T> generic interfaces. The implementations are provided to arrays at run time, and therefore are not visible to the documentation build tools. As a result, the generic interfaces do not appear in the declaration syntax for the Array class, and there are no reference topics for interface members that are accessible only by casting an array to the generic interface type (explicit interface implementations). The key thing to be aware of when you cast an array to one of these interfaces is that members which add, insert, or remove elements throw NotSupportedException.

In effect the IList<T> implementation acts like an explicit implementation, as Marc explained in his answer. This is why you can access certain members of IList<T> from the result of a cast but not from a variable typed as T[] specifically.



来源:https://stackoverflow.com/questions/4769971/why-does-c-sharp-array-not-have-count-property

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!