web-dev-qa-db-fra.com

Méthode d'extension et objet dynamique

Je vais résumer mon problème dans l'extrait de code suivant.

List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());

Le code ci-dessus fonctionne bien.

Maintenant, j'ai essayé ce qui suit

dynamic dList = list;
 Console.WriteLine(dList.First());

mais je reçois RuntimeBinderException. Pourquoi est-ce ainsi?

92
santosh singh

Pour développer la réponse de Stecya ... les méthodes d'extension ne sont pas prises en charge par la frappe dynamique sous la forme de méthodes d'extension, c'est-à-dire appelées comme s'il s'agissait de méthodes d'instance. Cependant, cela fonctionnera:

dynamic dList = list;
Console.WriteLine(Enumerable.First(dList));

Bien sûr, cela peut être utile ou non. Si vous pouviez donner plus d'informations sur les raisons et la manière dont vous essayez d'utiliser la saisie dynamique, nous pourrions peut-être vous aider davantage.

123
Jon Skeet

Pour développer la réponse de Jon, la raison pour laquelle cela ne fonctionne pas est que, dans les méthodes d'extension de code non dynamiques normales, elles fonctionnent en effectuant une recherche complète de toutes les classes connues du compilateur pour une classe statique qui a une méthode d'extension qui correspond. La recherche se déroule dans l'ordre en fonction de l'imbrication de l'espace de noms et des directives using disponibles dans chaque espace de noms.

Cela signifie que pour que l'invocation d'une méthode d'extension dynamique soit résolue correctement, le DLR doit savoir au moment de l'exécution quelles étaient toutes les imbrications d'espace de nommage et les directives usingdans votre code source. Nous n'avons pas de mécanisme pratique pour encoder toutes ces informations dans le site d'appel. Nous avons envisagé d'inventer un tel mécanisme, mais avons décidé qu'il était trop coûteux et produisait trop de risques de calendrier pour en valoir la peine.

130
Eric Lippert

Parce que First() n'est pas une méthode de List. Il est défini dans Linq Extension à IEnumerable<>

18
Stecya