2009-05-27 10 views
3

Lorsque vous avez une méthode comme:méthodes génériques dans les types non génériques

public static T DoSomething<T> (params T [ ] input) 

C# vous permet d'appeler sans spécifier le T, comme:

DoClass.DoSomething ("1", "2", "3"); 

Le chiffre du compilateur sur T par ce qui lui est passé?

Est-ce une bonne convention (pour omettre T dans ce cas)?

+5

Si cela vous intéresse, lisez la section 7.4.2 de la spécification et l'archive "inférence de type" de mon blog. –

+0

Merci Eric. Votre connaissance intérieure aide vraiment. –

Répondre

3

Oui, le compilateur peut inférer le paramètre de type générique dans la majorité des cas. (Un exceptin étant quand votre type est une expression de lambda, si je me souviens bien.)

Il est généralement considéré comme une bonne pratique d'omettre les paramètres génériques lorsqu'ils peuvent être déduits. En fait, je dirais que cela augmente la lisibilité d'une certaine quantité (les spécifier est souvent redondant).

+2

L'algorithme pour inférer des types de lambdas est complexe. Voir la section «deuxième phase» de la spécification pour plus de détails sur la façon dont nous le faisons. –

+0

@Eric: Oui, je l'imaginerais certainement. Sans le lire en entier, j'ai raison de dire qu'il échoue dans certaines situations compliquées, non? – Noldorin

+0

Oui. Il échoue aussi dans certaines situations relativement simples! :-) –

1

Oui, le compilateur trouvera généralement le type. C'est ce qu'on appelle "l'inférence de type".

Et oui, c'est une bonne pratique de laisser T sur le site d'appel. Le moins de code que vous écrivez, le moins de code que quelqu'un doit lire et comprendre plus tard.

Si vous avez ReSharper, il va faire un bon travail de vous montrer où vous pouvez et ne pouvez pas sortir avec le retrait du site de l'appel. Sinon, vous pouvez essayer de le retirer, et si le code compile, alors vous n'en avez pas besoin.

+0

Plus précisément, il est appelé "inférence de type de paramètre générique". Il existe également "l'inférence de type de paramètre local" et "l'inférence de type d'expression lambda" dans C# 3.0, qui sont similaires mais distincts. – Noldorin

1

Oui, lorsque le compilateur peut déterminer ce que T est censé être, il est redondant pour le spécifier. Je trouve que c'est une fonctionnalité intéressante, car elle devient fastidieuse et difficile à lire lorsque le nom du type est toujours listé (en particulier avec les noms longs).

1

Comme beaucoup l'ont mentionné, cela est dû à l'inférence de type de paramètre générique par le compilateur. Il découvre le type directement par le premier paramètre.

Une autre chose - si vous lisez les directives de conception pour les bibliothèques .net, il est recommandé d'écrire TOUTES vos méthodes génériques de manière à ce que les types puissent être déduits. Les méthodes génériques non-inférrables sont considérées comme plus difficiles à comprendre, et devraient être évitées autant que possible, selon le livre de directives de conception.

+0

Merci Reed. Je ne connaissais pas cette ligne directrice. Si vous écrivez une classe générique, est-ce encore valide? –

+0

Généralement, les méthodes d'une classe générique utilisent le même type que la classe, donc ce n'est pas vraiment un problème. C'était vraiment là pour des méthodes génériques. –

Questions connexes