C# 泛型 IEnumerable

3

我正在学习迭代器模式的内部原理,以便最终可以在一些类中使用它。下面是一个测试类:

public class MyGenericCollection : IEnumerable<int>
{
    private int[] _data = { 1, 2, 3 };

    public IEnumerator<int> GetEnumerator()
    {
        foreach (int i in _data)
        {
            yield return i;
        }
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

我对IEnumerable.GetEnumerator()部分感到困惑。在我运行的代码测试中,它从未被引用或使用,但是我必须拥有它来实现通用的IEnumerable
我确实理解IEnumerable<T>继承自IEnumerator,因此我必须同时实现两者。
除此之外,我不明白非通用接口何时会被使用。在调试过程中,它从未被调用。有人能帮我理解吗?

1
只有在引用类型是它们实现的接口时,才会使用显式接口实现。如果你执行 IEnumerable x = new myGenericCollection(),你会看到它运行。 - undefined
这就是.NET 1.0的负担。如果没有1.0,框架会有很大不同。但每个人都必须从某个地方开始,改进不能破坏所有现有的程序。 - undefined
@ZoharPeled 确实,这就是问题所在。 - undefined
1个回答

8
我对IEnumerable.GetEnumerator()这一部分感到困惑。在我运行的代码测试中,它从未被引用或使用过,但我必须拥有它来实现通用的IEnumerable。
当你的类型仅作为IEnumerable时,它将被任何使用你的类型的东西所使用。例如:
IEnumerable collection = new MyGenericCollection();
// This will call the GetEnumerator method in the non-generic interface
foreach (object value in collection)
{
    Console.WriteLine(value);
}

只有几个LINQ方法会调用它: CastOfType:

var castCollection = new MyGenericCollection().OfType<int>();

这是有道理的。我没有将我的MyGenericCollection对象实例化为IEnumerable对象,而只是一个MyGenericCollection对象。我认为这默认使用了泛型GetEnumerator()方法。很奇怪你会回答我的问题。我期待着《深入C#(第四版)》的发布,它似乎将在1月30日发布,而你显然是作者。只是我希望它能早点发布。无论如何,我认为答案很清楚。谢谢。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接