-3

編集:どうやらトピックから外れたようです... Programmers.StackExchange.comに移動します。

これは実際的な問題ではなく、なぞなぞです。

問題

を使用せずに、次と同等のものを実装する方法があるかどうか知りたいですyield

IEnumerable<T> Infinite<T>()
{
    while (true) { yield return default(T); }
}

ルール

  1. yieldキーワードは使えません
  2. C# 自体のみを直接使用します。IL コードや動的アセンブリの構築などは行いません。
  3. 基本的な .NET lib のみを使用できます (mscorlib.dllSystem.Core.dllに何を含めればよいかわかりません)。ただし、他の .NET アセンブリ (WPF?!) で解決策が見つかった場合は、私も興味があります。
  4. IEnumerable または IEnumerator を実装しないでください。

ノート

私が今までに来た最も近いもの:

IEnumerable<int> infinite = null;
infinite = new int[1].SelectMany(x => new int[1].Concat(infinite));

これは「正しい」ですが、enumerable を 14399 回繰り返した後に StackOverflowException が発生します (完全に無限ではありません)。

CLRには末尾再帰の最適化がないため、これを行う方法がないのではないかと考えています。証拠はいいだろう:)

4

3 に答える 3

5
  1. Take the yield example from your question and dump it into Visual Studio.
  2. Compile.
  3. Open in Reflector/ILSpy/dotPeek/etc. and display decompiled sources in C# 1.0 language level (or switch on display of compiler generated sources).
  4. Declare victory, eat cake.
于 2013-11-07T03:34:15.477 に答える
2

これは実質的に無限のイテレータです:

using System;
using System.Linq;

public class Test
{
    public static void Main()
    {
        var infiniteIterator =
            Enumerable.Range(Int32.MinValue, Int32.MaxValue)
                      .SelectMany(i => Enumerable.Range(Int32.MinValue, Int32.MaxValue))
                      .SelectMany(i => Enumerable.Range(Int32.MinValue, Int32.MaxValue))
                      .SelectMany(i => Enumerable.Range(Int32.MinValue, Int32.MaxValue))
                      .Select(i => default(int));

        foreach (var infinite in infiniteIterator)
            Console.WriteLine(infinite);
    }
}
于 2013-11-07T04:06:20.180 に答える
1

Use of IEnumerable<T> and yield invokes some C# compiler magic where it wraps the logic into an implementation of IEnumerable, like so:

IEnumerable<T> Infinite<T>() {
    return new Buzzlightyear<T>();
}
private class BuzzLightyear<T> : IEnumerable<T> where T : new() {
    public Boolean MoveNext() { return true; }
    public T Current { return new T(); }
}
于 2013-11-07T03:34:49.187 に答える