Y a-t-il déjà une raison d'utiliser des paramètres code> de type code> sur les génériques, c'est-à-dire: Il me semble que les génériques sont beaucoup plus utiles en ce qu'ils fournissent génériques Contraintes et avec C # 4.0, contre la contre-covérité et la covariance, ainsi que probablement d'autres caractéristiques que je ne connais pas. Il me semblerait que la forme générique a tous les plus et aucun négatif que le premier ne partage pas également. Alors, y a-t-il des cas où vous utiliseriez le premier à la place? P> p>
3 Réponses :
Absolument: Lorsque vous ne connaissez pas le type avant l'exécution. Par exemple: faisant cela lorsque Il permet également au paramètre d'être foo code> est générique est douloureux. C'est faisable mais douloureux. P> null code>, qui peut être utile dans certaines situations. P> p>
Il est aussi beaucoup plus cher et lent à faire avec des génériques (tous ces appels de réflexion ne peuvent pas être jolis)
Absolument - bien que la douleur soit normalement plus importante pour moi :)
Eh bien, ils ne sont vraiment pas les mêmes du tout. P>
Avec le second, vous avez en fait une classe de type de compilation (tout ce qui a été transmis par quiconque). Donc, vous pouvez appeler des fonctions spécifiques à ce sujet (par exemple si tout est une interface donnée). P>
Dans votre premier exemple, vous avez un objet de type "type". Donc, vous devrez toujours déterminer ce que c'est et faire un casting pour faire quoi que ce soit utile. P>
Exactement, la deuxième forme a tous les avantages de la vérification du temps de compilation. Donc, étant donné que, entre autres choses, je voulais savoir s'il y avait toujours une raison d'utiliser le premier. Je me rends compte qu'ils sont différents, mais différents ne veulent pas dire qu'un formulaire ne subsume pas complètement le besoin de l'autre.
Eh bien, mon point est que vous utiliserez le premier pour un but totalement différent de celui de la seconde. Vous ne les utiliseriez jamais pour la même chose (c'est-à-dire appeler des méthodes communes ou effectuer des actions «génériques» sur un type de classe donné).
Foo(someVariable.GetType()); // allowed Foo<someVariable.GetType()>(); // illegal