Ничего не понимаю. Создается какой-то левый код (using ncc 1.0.0.8745) в методе MoveNext (). К счастью, рефлектор его показывает, хотя сам рефлектор тоже может ошибаться. За этим примером следует кусок из рефлектора. Возможно дело в оптимизации хвостовой рекурсии. MoveNext () вызывает сам себя. Может быть, дело в другом. Рефлектор показывает, вообще, не то.
Компилятор довольно свежий.
using System;
using System.Collections.Generic;
public class SubEnumerator[T]: IEnumerator[T]
{
private mutable ts1 : IEnumerator[T];
private mutable ts2 : IEnumerator[T];
private cont : void -> IEnumerator[T];
public this (ts1 : IEnumerator[T], cont : void -> IEnumerator[T])
{
this.ts1 = ts1;
this.ts2 = null;
this.cont = cont;
}
public Reset () : void
{
throw NotSupportedException ()
}
public Dispose () : void
{
when (ts1 != null)
ts1.Dispose ();
when (ts2 != null)
ts2.Dispose ();
}
public MoveNext () : bool
{
if (ts2 != null)
ts2.MoveNext ()
else
{
if (ts1.MoveNext ())
true
else
{
ts1.Dispose ();
ts1 = null;
ts2 = cont ();
match (ts2)
{
| ts is SubEnumerator[T] =>
ts1 = ts.ts1;
ts2 = ts.ts2;
MoveNext ();
| _ =>
ts2.MoveNext ();
}
}
}
}
public Current : T
{
get
{
if (ts2 != null)
ts2.Current
else
ts1.Current
}
}
}
Здравствуйте, dsorokin, Вы писали:
D>Большое спасибо! То, что надо! Но все равно непонятно, что не так с моим кодом. Или переработал к концу недели...
Если ты про рефлектор то он может реверснуть только очень простой код. Чуть в сторону и тушите весла.
Если ты про логику то то я вообще не понял что ты там мудрил. Мне удалось разгадать только намерение.
D>Это — оптимизатор хвостовой части для enumerable comprehension. Без него comprehension был бы неюзабельным.
Я подожду пока ты закоммитишь и посмотрю на использование.
Возможно там можно будет еще пооптимизировать за счет кодогенерации.