編集:どうやらトピックから外れたようです... Programmers.StackExchange.comに移動します。
これは実際的な問題ではなく、なぞなぞです。
問題
を使用せずに、次と同等のものを実装する方法があるかどうか知りたいですyield
。
IEnumerable<T> Infinite<T>()
{
while (true) { yield return default(T); }
}
ルール
yield
キーワードは使えません- C# 自体のみを直接使用します。IL コードや動的アセンブリの構築などは行いません。
- 基本的な .NET lib のみを使用できます (
mscorlib.dll
他System.Core.dll
に何を含めればよいかわかりません)。ただし、他の .NET アセンブリ (WPF?!) で解決策が見つかった場合は、私も興味があります。 - IEnumerable または IEnumerator を実装しないでください。
ノート
私が今までに来た最も近いもの:
IEnumerable<int> infinite = null;
infinite = new int[1].SelectMany(x => new int[1].Concat(infinite));
これは「正しい」ですが、enumerable を 14399 回繰り返した後に StackOverflowException が発生します (完全に無限ではありません)。
CLRには末尾再帰の最適化がないため、これを行う方法がないのではないかと考えています。証拠はいいだろう:)