使用 foreach 枚举基数

Mat*_*ský 5 c# ienumerable

我试图在扩展另一个类的类中执行此操作,该类实现IEnumerable<T>

public override IEnumerator<T> GetEnumerator(){
    foreach (var item in base){
        // Some logic here
        yield return item;
        // Some more logic here
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,这会失败,并出现编译错误,指出“base”使用不正确。

我想继承父类的所有行为,除了将一些“虚拟”项目插入枚举集合并跳过一些其他项目之外。

我通过手动操作枚举器来解决这个问题(本质上是执行foreach扩展为 except 调用GetEnumeratoronbase而不是 的操作this)。但这并不能产生最直接的代码。

所以我的问题是:这可以用 foreach 来完成吗?

Ser*_*kiy 4

不,这不能用 foreach 来完成。

thisC# 中的和access有很大的区别base。当您使用this关键字时,它被分类为值(值的类型是使用时发生的类的实例类型)。但base关键字永远不会被视为值。它可以是基访问表达式的一部分,用于访问被当前类中类似命名的成员隐藏的基类成员:

   base.identifier 
   base[argument-list]
Run Code Online (Sandbox Code Playgroud)

因此,通过base关键字您只能访问基类的成员。但它不被视为基类型的值,并且它不能成为使用值的表达式的一部分(例如强制转换、foreach 语句等)。

执行您想要的操作的唯一有效方法是访问基类的成员:

public override IEnumerator<T> GetEnumerator()
{
    IEnumerator<T> enumerator = base.GetEnumerator();
    while (enumerator.MoveNext())
    {
        T item = enumerator.Current;
        // Some logic here
        yield return item;
        // Some more logic here
    }
}
Run Code Online (Sandbox Code Playgroud)