4

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

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

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

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

我通过手动操作枚举器来解决这个问题(主要是做foreach扩展为除了调用GetEnumeratorbase不是调用this)。但这并不会产生最直接的代码。

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

4

1 回答 1

3

不,它不能用 foreach 完成。

thisC#和base访问之间有很大的区别。当你使用this关键字时,它被归类为一个值(值的类型是出现使用的类的实例类型)。但是base关键字永远不会被视为一个值。它可能是基访问表达式的一部分,用于访问被当前类中类似名称的成员隐藏的基类成员:

   base.identifier 
   base[argument-list]

所以,通过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
    }
}
于 2012-04-24T11:20:45.470 回答