在visual studio 2015中,当我访问List.cs并查看类声明时,我只看到一个名为GetEnumerator的方法:
public Enumerator GetEnumerator();
另一方面,接口IEnumerable< T>和IEnumerable指定它必须定义格式为的方法:
IEnumerator<T> GetEnumerator();
IEnumerator GetEnumerator();
这让我相信即使reuturn类型没有激烈匹配,也可以实现接口方法。虽然,当我尝试时,结果证明是错误的。
这里发生了什么?
答案 0 :(得分:0)
接口是明确实现的。您看到的方法不是接口实现,它是类的单独方法。
答案 1 :(得分:0)
如果查看源代码,您将看到两种不同的GetEnumerator方法:
Null
仅在通过IEnumerator接口访问对象时才使用第二个。但它们都使用相同的底层实现。
public Enumerator GetEnumerator() {
return new Enumerator(this);
}
IEnumerator<T> IEnumerable<T>.GetEnumerator() {
return new Enumerator(this);
}
您仍然可以按如下方式访问强类型版本:
[Serializable]
public struct Enumerator : IEnumerator<T>, System.Collections.IEnumerator
{
...
}
对于var exampleList = new List<string>();
var enumerator1 = ((IEnumerable<string>)exampleList).GetEnumerator()
var enumerator2 = (IEnumerable<string>) exampleList.GetEnumerator()
,您要转换列表以使用IEnumerable接口的GetEnumerator()方法。对于enumerator1
,您依赖的事实是每个都使用相同的实现,因此您可以投射枚举器。