【问题标题】:C# Generic IEnumerableC# 通用 IEnumerable
【发布时间】:2018-11-29 09:31:31
【问题描述】:

我正在学习底层的迭代器模式,所以最终我可以在某些类中使用它。这是一个测试类:

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();
    }
}

我对@9​​87654322@ 部分感到困惑。在我运行的代码测试中,它从未被引用或使用过,但我必须拥有它来实现通用的IEnumerable

我知道IEnumerable&lt;T&gt; 继承自IEnumerator,所以我必须同时实现这两个。

除此之外,我在使用非通用接口时感到困惑。在调试中它从未进入。谁能帮我理解一下?

【问题讨论】:

  • 显式接口实现仅在引用类型是它们实现的接口时使用。如果你愿意 IEnumerable x = new myGenericCollection() 你会看到它运行。
  • 这是 .NET 1.0 税。如果 1.0 从未出现,该框架看起来会非常不同。但是每个人都必须从某个地方开始,改进不能破坏所有现有程序。
  • @ZoharPeled 确实,这就是问题所在。

标签: c# ienumerable ienumerator


【解决方案1】:

我对 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# in Depth(第 4 版),它似乎将于 1 月 30 日发布,显然你是它的作者。我只是希望它能早一点发布。无论如何,我认为答案很明确。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多