Napisałem ten sposób przedłużenie (który kompiluje):Spłaszczyć IEnumerable <IEnumerable <>>; zrozumienia rodzajowych
public static IEnumerable<J> Flatten<T, J>(this IEnumerable<T> @this)
where T : IEnumerable<J>
{
foreach (T t in @this)
foreach (J j in t)
yield return j;
}
Poniższy kod powoduje błąd czasu kompilacji (nie znaleziono odpowiedniej metody), dlaczego?:
IEnumerable<IEnumerable<int>> foo = new int[2][];
var bar = foo.Flatten();
Gdybym wdrożyć rozszerzenie jak poniżej, mam żadnych kompilacji błąd czasu:
public static IEnumerable<J> Flatten<J>(this IEnumerable<IEnumerable<J>> @this)
{
foreach (IEnumerable<J> js in @this)
foreach (J j in js)
yield return j;
}
Edit (2): To pytanie uważam odpowiedział, ale podniósł kolejne pytanie dotyczące rozdzielczość przeciążeniowa i ograniczenia typu. To pytanie mam tutaj: Why aren't type constraints part of the method signature?
Twoja edycja nie działa, ponieważ masz zbyt wiele wyliczanych okolic. 'foo.Flatten, int>();' powinien działać. –
dlev