c# - 用 foreach 遍历基数

标签 c# ienumerable

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

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

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

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

我通过手动操作枚举器解决了这个问题(本质上是做 foreach 扩展到除了在 GetEnumerator 上调用 base 而不是 this )。但这并不会产生最直接的代码。

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

最佳答案

不,它不能用 foreach 完成。

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

   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
    }
}

关于c# - 用 foreach 遍历基数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10294742/

相关文章:

c# - 将类添加到 ActionLink

c# - 使用更多 channel 或端点通过 .NET 远程处理公开的高效多项服务?

c# - IEnumerable 和延迟加载

c# - 为什么即使在每次迭代时重新创建查询也会应用多个过滤器

c# - 计算 IEnumerable 的计数(非通用)

c# - 使用 Firebird ado.net 提供程序在客户端和服务器上请求的有线加密级别不兼容

c# - 从 Javascript 访问 C# 变量?

c# - HttpClient : limit response (downloaded file) size while using HttpResponseMessage. 内容.ReadAsStreamAsync()

c# - 使用 linq 生成动态集合

linq - Linq 如何在 IOrderedEnumerable 方法之后使用 IEnumerable 方法?