using System.Collections;
public interface IRefEnumerator<T> : IEnumerator, IDisposable
new ref T Current { get; }
public interface IRefEnumerable<T>
public IRefEnumerator<T> GetEnumerator();
public class ArrayEnumerable<T> : IRefEnumerable<T>
public ArrayEnumerable(T[] data) => _data = data ?? throw new ArgumentNullException(nameof(data));
private class ArrayEnumerator<T> : IRefEnumerator<T>
public ArrayEnumerator(T[] data) => _data = data ?? throw new ArgumentNullException(nameof(data));
object IEnumerator.Current => _data[_pos];
public void Dispose() { }
public bool MoveNext() => ++_pos < _data.Length;
public void Reset() => _pos = -1;
public IRefEnumerator<T> GetEnumerator() => new ArrayEnumerator<T>(_data);
public static class ArrayEnumerable
public static ArrayEnumerable<T> AsRefEnumerable<T>(this T[] data) => new ArrayEnumerable<T>(data);
public static void Main()
foreach(ref var x in a.AsRefEnumerable())
Console.WriteLine(string.Join(",", a));