是否可以在不使用仅包含C#代码的yield的情况下实现无限的IEnumerable?

sin*_*law -2 c# ienumerable infinite-loop

编辑:显然偏离主题...转移到Programmers.StackExchange.com.

这不是一个实际问题,它更像是一个谜.

问题

我很想知道是否有办法实现与以下相同的东西,但不使用yield:

IEnumerable<T> Infinite<T>()
{
    while (true) { yield return default(T); }
}
Run Code Online (Sandbox Code Playgroud)

规则

  1. 您无法使用该yield关键字
  2. 直接使用C#本身 - 没有IL代码,没有构建动态程序集等.
  3. 您只能使用基本的.NET lib(仅限mscorlib.dll,System.Core.dll?不确定还包括哪些内容).但是,如果您找到一些其他.NET程序集(WPF ?!)的解决方案,我也很感兴趣.
  4. 不要实现IEnumerable或IEnumerator.

笔记

我最接近的是:

IEnumerable<int> infinite = null;
infinite = new int[1].SelectMany(x => new int[1].Concat(infinite));
Run Code Online (Sandbox Code Playgroud)

这是"正确的",但在14399次迭代通过可枚举(非常无限)之后会遇到StackOverflowException.

我认为由于CLR 缺乏尾递归优化,可能无法做到这一点.证明会很好:)

Mik*_*bel 5

  1. 就拿yield从你的问题例如和转储到Visual Studio.
  2. 编译.
  3. 在Reflector/ILSpy/dotPeek/etc中打开.并显示C#1.0语言级别的反编译源(或打开编译器生成的源的显示).
  4. 宣告胜利,吃蛋糕.