【问题标题】:Problem when implementing a wrap class for an array when trying to implement IEnumerable尝试实现 IEnumerable 时为数组实现包装类时出现问题
【发布时间】:2010-10-17 17:10:21
【问题描述】:

我正在实现一个基本包装数组的类:

public abstract class IndividualBase : IEnumerable<Gene>
{
    private readonly Gene[] genoma;

    ...

    public IEnumerator<Gene> GetEnumerator()
    {
        return genoma.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return genoma.GetEnumerator();
    }
}

问题是第一个GetEnumerator() 给我带来了麻烦——它告诉我

不能隐式转换类型 'System.Collections.IEnumerator' 到 'System.Collections.Generic.IEnumerator'。 存在显式转换(您是 缺少演员表?)

虽然我了解问题所在,但我完全不知道如何解决它。有人吗?

谢谢

【问题讨论】:

    标签: c# arrays ienumerable


    【解决方案1】:

    你可以试试:

    IEnumerable<Gene> typed = genoma;
    return typed.GetEnumerator();
    

    只是为了让编译器满意。虽然数组实现了通用的 Enumerable 接口,但公共 GetEnumerator() 中不存在此接口。有了上面的内容,我们简单地转换为首选的 API。这是一个微不足道的演员;运行时不应进行任何检查(因为编译器和 CLI 都知道它是有效的)。

    【讨论】:

    • 仅供参考:我比我的genoma.Cast&lt;Gene&gt;().GetEnumerator() 答案更喜欢这个。 Cast 可能足够聪明,可以在后台执行此操作,但它也可能会添加额外的间接层来投射每个项目,而不是整个项目。
    【解决方案2】:

    您的问题是您返回的是IEnumerable,而不是IEnumerble&lt;Gene&gt;

    改成这样:

    return genoma.Cast<Gene>().GetEnumerator();
    

    编辑

    保留这个以另一种方式做到这一点,但是,我更喜欢 Marc 的回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 2023-01-30
      • 2019-04-16
      相关资源
      最近更新 更多