[英]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 的第一个版本只有非泛型集合,泛型是后来引入的,所以有IEnumerable
和IEnumerator
泛型和非泛型变体。
你可以参考来源看,它是如何在内部实现泛型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.