インターフェイスで渡した場合もボックス化が起きないようにしたいならこうなる
struct ValueEnumerator<out T> : IEnumerator<T> { /*好きなように実装しろ*/ }
interface IValueEnumerable<out T> { ValueEnumerator<T> GetEnumerator(); }
これでボックス化なしでforeachが使えるはずだが、ValueEnumerator<out T>を実装するのが難しいだろうな