【发布时间】:2012-09-09 18:59:51
【问题描述】:
很长一段时间以来,我都对以下内容感到好奇:
int[] array = new int[1];
int iArrayLength = array.Length; //1
由于数组实现了 IList 接口,因此允许以下操作:
int iArrayCount = ((IList<int>)array).Count; //still 1
但是:
int iArrayCount = array.Count; //Compile error. WHY?
int iArrayLength = array.Length; //This is what we learned at school!
问题:
数组如何实现IList<T>(尤其是来自IList<T> 的int Count { get; } 属性)而不允许在基类上使用?
【问题讨论】:
-
您可以自己模拟这种情况,方法是在您自己继承的类中隐藏基类的“Count”属性,并将其设为私有。 VB.NET 对此有一个明确的关键字“阴影”,但不确定 C#。
-
你的标题有误。数组实际上从
ICollection实现Count:int ICollection.Count { get { return this.Length; } } -
@TimSchmelter 但
IList<T>继承自ICollection<T>;ICollection<T>也有一个Count属性,所以所有实现IList<T>的类型也必须实现ICollection<T>.Count。确实,IList<T>中没有定义该属性,但这个问题是合理的。 -
@phoog:除了它不是
IList的属性之外,它是在数组中实现的,这就是我说标题是的主要原因错误的(“..没有实现..”)。 -
@TimSchmelter 啊哈,我明白了,我误解了你的意思。但是如果你从不了解显式接口实现的角度来阅读标题,那么这个问题就很有意义了。 (顺便说一句,“错误的”,而不是“错误的”)。