2009-08-27 16 views
0

J'utilise le Concurrency and Coordination Runtime et j'écris un code similaire à ce qui est décrit dans la documentation. La ligne suivante ne peut pas compiler:Pourquoi C# dit-il que la IterativeTask du CCR est non générique?

yield return new IterativeTask<string,Object,Object,long[]>("Hi",a,b,ls, itfunc); 

Le compilateur donne ce message d'erreur:

The non-generic type 'Microsoft.Ccr.Core.IterativeTask' cannot be used with type arguments 

Ce qui est mistifying parce que la documentation utilise cette méthode avec des arguments de type et il est clairement générique.

(je vais poster ma réponse ici, c'est encouraged si je comprends bien)

Répondre

3

Il se trouve qu'il ya une limite au nombre de paramètres génériques, on peut utiliser avec IterativeTask: il peut prendre trois mais pas plus.

Ainsi, ce code compile (une fois que vous changez itfunc d'utiliser un argument moins):

yield return new IterativeTask<string,Object,long[]>("Hi",a,ls, itfunc); 

Si vous avez vraiment besoin de toutes les informations dans les arguments, vous pouvez créer un certain type pour les retenir:

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);