C# IEnumerable无法计算表达式,因为当前线程处于堆栈溢出状态

C# IEnumerable无法计算表达式,因为当前线程处于堆栈溢出状态,c#,enumerable,C#,Enumerable,我正在编写一个应用程序,它接收Wireshark文件(Pcap、Snopp、Pcapng…),打开它并读取所有数据包 我的基类: public abstract class WiresharkFile { ... } public IEnumerator<WiresharkFilePacket> GetEnumerator() { return GetEnumerator(); } 以及实现的所有子类IEnumerable: public class Libpcap

我正在编写一个应用程序,它接收Wireshark文件(Pcap、Snopp、Pcapng…),打开它并读取所有数据包

我的基类:

public abstract class WiresharkFile
{
   ...
}
public IEnumerator<WiresharkFilePacket> GetEnumerator()
{
    return GetEnumerator();
}
以及实现的所有子类
IEnumerable

public class Libpcap : WiresharkFile, IDisposable, IEnumerable<WiresharkFilePacket>
{
    ....
}
然后,当我想在文件上循环并读取数据包时:

foreach (var packet in wiresharkFile)
{
   ...
}
我得到这个错误:

foreach语句无法对WiresharkFile类型的变量进行操作 因为WiresharkFile'不包含的 “GetEnumerator”

所以我在WiresharkFile基类中添加了这个函数:

public abstract class WiresharkFile
{
   ...
}
public IEnumerator<WiresharkFilePacket> GetEnumerator()
{
    return GetEnumerator();
}

您看到的是
StackOverflowException
,因为您正在调用自己

public IEnumerator<WiresharkFilePacket> GetEnumerator()
{
    return GetEnumerator();
}
public IEnumerator GetEnumerator()
{
返回GetEnumerator();
}
您需要正确地实现一个迭代器才能使其工作。例如:

wiresharkFile = new Libpcap(file);
public IEnumerator<WiresharkFilePacket> GetEnumerator()
{
    for (int i = 0; i < 10; i++)
        yield return new WiresharkFilePacket();
}
public IEnumerator GetEnumerator()
{
对于(int i=0;i<10;i++)
产生并返回新的WiresharkFilePacket();
}

您的
WiresharkFile
应该有一些内部集合,它可以迭代。它是从pcap解析出来并返回的数据包。简单地创建一个
GetEnumerator
方法不会起任何作用。更多信息,如果所有派生类都提供了
GetEnumerator()
方法,并且对将来的任何派生类都要求使用该方法没有问题,但是基类不能有意义地定义一个方法,那就是将其标记为
abstract

public abstract IEnumerator<WiresharkFilePacket> GetEnumerator();
公共抽象IEnumerator GetEnumerator();

这样就足以在基类上实现
IEnumerable
,您还不需要完整的定义。

请参见我的编辑,我的类使用私有类实现IEnumerable,那么,如何将其转换为普通IEnumerable?请参见我的编辑,我的类使用私有类实现IEnumerable,所以,如何将其转换为普通IEnumerable?