Почему C# говорит, что IterativeTask в CCR не является универсальным?
Я использую http://en.wikipedia.org/wiki/Concurrency_and_Coordination_Runtime и пишу код, аналогичный тому, что описан в документации. Следующая строка не компилируется:
yield return new IterativeTask<string,Object,Object,long[]>("Hi",a,b,ls, itfunc);
Компилятор выдает это сообщение об ошибке:
The non-generic type 'Microsoft.Ccr.Core.IterativeTask' cannot be used with type arguments
Что неверно, потому что документация использует этот метод с аргументами типа, и он явно универсален.
(Я собираюсь опубликовать свой собственный ответ здесь, это поощряется, насколько я понимаю)
1 ответ
Оказывается, существует ограничение на количество универсальных параметров, которые можно использовать с IterativeTask: это может занять три, но не более.
Итак, этот код компилируется (как только вы измените itfunc, чтобы использовать на один меньше аргумент):
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);