Оказывается, что существует ограничение на количество универсальных параметров, которые можно использовать с IterativeTask: это может занять три, но не более.
Итак, этот код компилируется (как только вы измените его, чтобы использовать на один аргумент меньше):
yield return new IterativeTask<string,Object,long[]>("Hi",a,ls, itfunc);
Если вам действительно нужна вся информация в аргументах, вы можете создать некоторый тип для их хранения:
struct Z {
string msg;
Object one;
Object two;
long[] ls;
}
Z z = new Z { msg="Hi", one=a, two=b, ls= longs };
yield return new IterativeTask<Z>(z, itfunc);