【问题标题】:List GetEnumerator return type does not match interfaceList GetEnumerator 返回类型与接口不匹配
【发布时间】:2016-08-15 12:33:39
【问题描述】:

在 Visual Studio 2015 中,当我转到 List.cs 并查看类声明时,我只看到一个名为 GetEnumerator 的方法:

public Enumerator GetEnumerator();

另一方面,接口 IEnumerable 和 IEnumerable 指定它必须定义格式为:

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

这让我相信即使返回类型不完全匹配,接口方法也可以实现。不过,当我尝试时,结果证明是错误的。

这里发生了什么?

【问题讨论】:

    标签: c# .net list collections interface


    【解决方案1】:

    如果您查看源代码,您会看到两个不同的 GetEnumerator 方法:

    public Enumerator GetEnumerator() {
        return new Enumerator(this);
    }
    
    IEnumerator<T> IEnumerable<T>.GetEnumerator() {
        return new Enumerator(this);
    }
    

    仅当您通过 IEnumerator 接口访问对象时才使用第二个。但是,它们都使用相同的底层实现。

    [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()
    

    对于enumerator1,您将列表强制转换为使用 IEnumerable 接口的 GetEnumerator() 方法。对于enumerator2,您依赖于每个都使用相同的实现这一事实,因此您可以只转换枚举器。

    【讨论】:

    • 这是否意味着该类没有实现,在元数据视图中,我看不到 GetEnumerator 的显式实现,因为它是私有的?
    • 您可以强制转换以查看强类型实现。我将编辑我上面的帖子以明确说明。
    • 谢谢,很有帮助
    【解决方案2】:

    接口是显式实现的。您看到的方法不是接口实现,它是类的单独方法。

    【讨论】:

      猜你喜欢
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 2014-09-22
      • 1970-01-01
      相关资源
      最近更新 更多