C# 为什么不使用收益率而不是列表<;T>;。统计员

C# 为什么不使用收益率而不是列表<;T>;。统计员,c#,yield,C#,Yield,我只是发现List类中有一个名为Enumerator的嵌套结构 //使用给定的 //删除元素的权限。如果对列表进行了修改 //枚举正在进行时,MoveNext和 //枚举数的GetObject方法将引发异常。 // 公共枚举器GetEnumerator(){ 返回新的枚举数(此); } [可序列化] 公共结构枚举器:IEnumerator、System.Collections.IEnumerator { 私人名单; 私有整数索引; 私有int版本; 私人T电流; 内部枚举器(列表){ this.

我只是发现List类中有一个名为Enumerator的嵌套结构

//使用给定的
//删除元素的权限。如果对列表进行了修改
//枚举正在进行时,MoveNext和
//枚举数的GetObject方法将引发异常。
//
公共枚举器GetEnumerator(){
返回新的枚举数(此);
}
[可序列化]
公共结构枚举器:IEnumerator、System.Collections.IEnumerator
{
私人名单;
私有整数索引;
私有int版本;
私人T电流;
内部枚举器(列表){
this.list=列表;
指数=0;
版本=列表。\u版本;
电流=默认值(T);
}
//省略其他代码
}

正如我所知,yield关键字将在IL级别转换为上面的嵌套结构,那么为什么Microsoft不直接使用yield?

列表。枚举器是值类型
yield
没有使用公共值类型返回类型而不是
IEnumerator
的选项。此外,该代码的日期早于
收益率
的引入。否。列表的版本在此处很重要,以防止更改集合。版本。。。是的,很有道理。IIRC也是一种优化,因此编译器运行时可以编译一段代码,直接调用值类型上的IEnumerator方法,而不是通过虚拟分派。这并不意味着运行时应该或者将会这样做。它用于性能优化2。代码在引入收益率之前就已经存在了。3.使用版本防止更改集合。还有什么吗?
列表。枚举器是值类型
yield
没有使用公共值类型返回类型而不是
IEnumerator
的选项。此外,该代码的日期早于
收益率
的引入。否。列表的版本在此处很重要,以防止更改集合。版本。。。是的,很有道理。IIRC也是一种优化,因此编译器运行时可以编译一段代码,直接调用值类型上的IEnumerator方法,而不是通过虚拟分派。这并不意味着运行时应该或者将会这样做。它用于性能优化2。代码在引入收益率之前就已经存在了。3.使用版本防止更改集合。还有别的吗?
// Returns an enumerator for this list with the given
// permission for removal of elements. If modifications made to the list 
// while an enumeration is in progress, the MoveNext and 
// GetObject methods of the enumerator will throw an exception.
//
public Enumerator GetEnumerator() {
    return new Enumerator(this);
}

[Serializable]
public struct Enumerator : IEnumerator<T>, System.Collections.IEnumerator
{
    private List<T> list;
    private int index;
    private int version;
    private T current;

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

    //Omit other code
}