List GetEnumerator返回类型与接口不匹配

时间:2016-04-22 03:31:27

标签: c# .net list collections interface

在visual studio 2015中,当我访问List.cs并查看类声明时,我只看到一个名为GetEnumerator的方法:

public Enumerator GetEnumerator();

另一方面,接口IEnumerable< T>和IEnumerable指定它必须定义格式为的方法:

IEnumerator<T> GetEnumerator();
IEnumerator GetEnumerator();

这让我相信即使reuturn类型没有激烈匹配,也可以实现接口方法。虽然,当我尝试时,结果证明是错误的。

这里发生了什么?

2 个答案:

答案 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,您依赖的事实是每个都使用相同的实现,因此您可以投射枚举器。