繁体   English   中英

实现 IEnumerable<T> 界面

[英]Implementing IEnumerable<T> interface

根据我基于 Microsoft 文档的理解。 当您实现IEnumerable接口时,您也被迫实现IEnumerator 根据我的理解,这意味着我需要为MoveNext() 、 Reset() 和属性current{get;}等方法提供定义

但是我遇到了这个不符合我理解的片段:

    class Option<T> : IEnumerable<T>
    {
        private IEnumerable<T> Content { get; }

        private Option(IEnumerable<T> content)
        {
            this.Content = content;
        }

        public static Option<T> Some(T value) => new Option<T>(new[] {value});
        public static Option<T> None() => new Option<T>(new T[0]);

        public IEnumerator<T> GetEnumerator() => this.Content.GetEnumerator(); //Need explanation
        IEnumerator IEnumerable.GetEnumerator() => this.GetEnumerator();//Need explanation
    }

这是什么this.Content.GetEnumerator(); this.GetEnumerator(); 在这里做什么? 没有MoveNext()Reset()current

另外我无法理解上面两行代码在做什么?

这是什么this.Content.GetEnumerator(); this.GetEnumerator(); 在这里做什么?

第一种方法返回通用IEnumerator<T> ,第二种方法使用IEnumerable接口的显式实现返回非通用变体(实际上, IEnumerator<T>继承非通用IEnumerator ,如您在文档中所见)

Current属性在泛型IEnumerator<T>MoveNext()Reset()在非泛型IEnumerator中声明。

IEnumerable公开IEnumerator结构以遍历集合,这是分离方法的原因。

.NET 的第一个版本只有非泛型集合,泛型是后来引入的,所以有IEnumerableIEnumerator泛型和非泛型变体。

你可以参考来源看,它是如何在内部实现泛型List<T>

internal Enumerator(List<T> list) {
    this.list = list;
    index = 0;
    version = list._version;
    current = default(T);
}

实际上列表实例被传递给Enumerator构造函数,并且MoveNext()Reset()Current正在处理传递的实例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM