Можно ли сделать то же самое в C ++ / CLI? Там нет ключевого слова yield, поэтому моя внутренняя реакция такова, что нет, что отстой, но что вы можете сделать?
yield return
в C # - это просто ярлык, который позволяет компилятору сгенерировать необходимый вам код, который реализует реализацию IEnumerable<T>
и IEnumerator<T>
. Поскольку C ++ / CLI не предлагает эту услугу, вы должны сделать это вручную: просто напишите два класса, один, который реализует каждый интерфейс (или, как это делает компилятор C #, один класс, реализующий оба, но это может стать грязным, если все это можно назвать неоднократно - кий: государственность).
Вот небольшой пример - поскольку у меня нет IDE, а мой C ++ / CLI немного ржавый, я дам его в C #:
class MyRange : IEnumerable<int> {
private class MyRangeIterator : IEnumerator<int> {
private int i = 0;
public int Current { get { return i; } }
object IEnumerator.Current { get { return Current; } }
public bool MoveNext() { return i++ != 10; }
public void Dispose() { }
void IEnumerator.Reset() { throw new NotImplementedException(); }
}
public IEnumerator<int> GetEnumerator() { return new MyRangeIterator(); }
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}
// Usage:
foreach (int i in new MyRange())
Console.WriteLine(i);