【问题标题】:Why does List<T> declare GetEnumerator() and IEnumerable<T>.GetEnumerator()?为什么 List<T> 声明 GetEnumerator() 和 IEnumerable<T>.GetEnumerator()?
【发布时间】:2021-08-25 06:06:24
【问题描述】:

List为什么要定义这三个方法?

    public Enumerator GetEnumerator()
        => new Enumerator(this);

    IEnumerator<T> IEnumerable<T>.GetEnumerator()
        => new Enumerator(this);

    IEnumerator IEnumerable.GetEnumerator()
        => new Enumerator(this);

他们都在做同样的事情。仅仅拥有这个还不够吗:

public Enumerator GetEnumerator()
        => new Enumerator(this);

【问题讨论】:

  • Enumerator GetEnumerator() 让它返回一个结构枚举器以在foreach 循环中使用,而无需分配。 IEnumerator&lt;T&gt; IEnumerable&lt;T&gt;.GetEnumerator() 让它从IEnumerable&lt;T&gt; 接口实现IEnumerator&lt;T&gt; GetEnumerator() 方法,所以你可以做IEnumerable&lt;T&gt; x = new List&lt;T&gt;(); foreach (var item in x) ...

标签: c# interface ienumerable ienumerator explicit-interface


【解决方案1】:

仅仅拥有这个还不够吗:

public Enumerator GetEnumerator()
       => new Enumerator(this);

不,它不会,因为这不会实现IEnumerable&lt;T&gt;IEnumerable,其中GetEnumerator() 方法的返回类型分别为IEnumerator&lt;T&gt;IEnumerator

返回类型必须匹配才能实现接口。

确实,自己测试一下很容易:

using System.Collections;
using System.Collections.Generic;

public class MyList<T> : IEnumerable<T>
{
    public Enumerator GetEnumerator() =>
        new Enumerator();

    // Implement this fully so we can concentrate on IEnumerable<T>
    public struct Enumerator : IEnumerator<T>
    {
        public T Current => default;
        object IEnumerator.Current => default;
        public bool MoveNext() => true;
        public void Reset() {}
        public void Dispose() {}
    }
}

这给出了以下错误:

  • 错误 CS0738:“MyList”未实现接口成员“IEnumerable.GetEnumerator()”。 “MyList.GetEnumerator()”无法实现“IEnumerable.GetEnumerator()”,因为它没有匹配的返回类型“IEnumerator”。
  • 错误 CS0738:“MyList”未实现接口成员“IEnumerable.GetEnumerator()”。 “MyList.GetEnumerator()”无法实现“IEnumerable.GetEnumerator()”,因为它没有匹配的返回类型“IEnumerator”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2013-02-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多