Я написал этот метод расширения (который компилирует):Сгладить IEnumerable <IEnumerable <>>; понимание дженерики
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;
}
ниже код вызывает ошибку компиляции времени (не подходящий метод не найден), почему?:
IEnumerable<IEnumerable<int>> foo = new int[2][];
var bar = foo.Flatten();
Если я реализую расширение, как показано ниже, я не получаю компиляции ошибки времени:
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): Этот вопрос я считаю, ответил, но он поднял еще один вопрос, касающийся разрешение перегрузки и ограничения типов. Этот вопрос, который я поставил здесь: Why aren't type constraints part of the method signature?
Ваше редактирование не работает, потому что у вас слишком много окружающих перечислимых. 'foo.Flatten, int>();' должен работать. –
dlev