【问题标题】:How Array of our custom classes work with foreach without implemented IEnumerable?我们的自定义类数组如何在没有实现 IEnumerable 的情况下与 foreach 一起使用?
【发布时间】:2011-03-04 10:51:41
【问题描述】:

这个长标题已经包含了我所有的问题,所以我只想举个例子

MyClass[] array

这个数组如何在不实现 IEnumerable 接口的方法的情况下与 Foreach 一起工作?

【问题讨论】:

    标签: c# .net foreach ienumerable


    【解决方案1】:

    Array 实现 IEnumerable。引用文档:

    在 .NET Framework 2.0 版中, 数组类实现 System.Collections.Generic.IList(T), System.Collections.Generic.ICollection(T), 和 System.Collections.Generic.IEnumerable(T) 通用接口。这 提供给数组的实现 在运行时,因此不是 对文档构建可见 工具。结果,通用 接口不会出现在 数组的声明语法 类,并且没有参考 接口成员的主题是 只能通过将数组转换为 通用接口类型(显式 接口实现)。钥匙 施放时要注意的事情 这些接口之一的数组是 添加、插入或 删除元素抛出 NotSupportedException。

    【讨论】:

      【解决方案2】:

      框架类型 Array 实现 IEnumerable...因此,.NET 中的任何数组(任何类型)都实现 IEnumerable。

      【讨论】:

        【解决方案3】:

        foreach 不需要 from 类型来实现 IEnumerable 接口,它只需要 GetEnumerator() 方法。

        【讨论】:

        • 该类需要实现所有的IEnumerable方法,而不仅仅是GetEnumerator()
        • @Steve: IEnumerable 只有一个方法,GetEnumerator!
        • 这就是我早上回答问题的第一件事。我在这个问题的答案中填写了 MSDN 信息,这表明需要额外的方法,这些方法位于 IEnumerator 接口上。
        【解决方案4】:

        以下来自MSDN

        在 C# 中,这不是绝对必要的 用于继承的集合类 IEnumerable 和 IEnumerator 按顺序排列 与foreach兼容。只要 因为班级有要求 GetEnumerator、MoveNext、Reset 和 Current members,它将与 前锋。 省略接口有 使您能够 定义 Current 的返回类型 比 Object 更具体,后者 提供类型安全。

        【讨论】:

        • 为了类型安全,您可以(并且应该)实现 IEnumerable
        • 我没有发现不能在自己的代码中使用 IEnumerable 的情况,我只是在回答如何在不使用 IEnumerable 接口的情况下让 foreach 工作的原始问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        • 2013-02-18
        • 1970-01-01
        • 2016-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多