객체 하나에 GetEnumerator를 여러개 만들경우 foreach나 스프레드연산(..) 에서 어떤타입인지 추론을 못해서 명시적으로 써줘야 한다.
class의 경우에 as 쓰면 된다 치는데 ref struct에서 가장 깔끔하게 지정할 방법을 찾아헤맴.
힙할당을 배제하려면 결국 IEnumerator객체가 생길일도 있어선 안되니까 IEnumerable도 쓰면 안되는거 아닌지? 전용인터페이스 선언이 필요?
using System.Collections;
using System.Collections.Generic;
int[] arr;
arr = [.. new EE() as IEnumerable<int>];
arr = [.. ToEnumerable<int>.This(new RefEE())];
class EE : IEnumerable<int>, IEnumerable<byte>
{
IEnumerator IEnumerable.GetEnumerator() => new List<object>().GetEnumerator();
IEnumerator<int> IEnumerable<int>.GetEnumerator() => new List<int>().GetEnumerator();
IEnumerator<byte> IEnumerable<byte>.GetEnumerator() => new List<byte>().GetEnumerator();
}
ref struct RefEE : IEnumerable<int>, IEnumerable<byte>
{
IEnumerator IEnumerable.GetEnumerator() => new List<object>().GetEnumerator();
IEnumerator<int> IEnumerable<int>.GetEnumerator() => new List<int>().GetEnumerator();
IEnumerator<byte> IEnumerable<byte>.GetEnumerator() => new List<byte>().GetEnumerator();
}
static class ToEnumerable<T>
{
public static Enumerable<E> This<E>(E e) where E : IEnumerable<T>, allows ref struct => new(e);
public readonly ref struct Enumerable<E>(E e) where E : IEnumerable<T>, allows ref struct
{ readonly E e = e; public readonly IEnumerator<T> GetEnumerator() => e.GetEnumerator(); }
}
댓글 0