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 correctement.
Maintenant j'ai essayé ce qui suit
dynamic dList = list;
Console.WriteLine(dList.First());
mais je reçois RuntimeBinderException, pourquoi est-ce le cas?
this
est dynamique ici, mais si vous atterrissez ici, vous devriez probablement vous pencher aussi sur cette questionRéponses:
Pour développer la réponse de Stecya ... les méthodes d'extension ne sont pas supportées par le typage dynamique sous forme de méthodes d'extension , c'est-à-dire appelées comme s'il s'agissait de méthodes d'instance. Cependant, cela fonctionnera:
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 pourrons peut-être vous aider davantage.
la source
dynamic
là où vous en avez vraiment besoin ... fondamentalement, si vous accédiez aux membres avec réflexion, c'est un grand signe. D'un autre côté, je suis un typeur statique irréductible - d'autres peuvent suggérer des politiques moins pessimistes :)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 standard non dynamiques 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
using
directives disponibles dans chaque espace de noms.Cela signifie que pour obtenir une résolution correcte d'un appel de méthode d'extension dynamique, le DLR doit savoir au moment de l'exécution quelles
using
étaient toutes les imbrications et directives d' espaces de noms dans 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.la source
dynamic
objets sont égaux à C # :,DynamicObject
il n'y a donc aucun moyen de les différencier et est l'une des raisons pour lesquelles il n'est pas possible d'ajouter des méthodes d'extensiondynamic
, c'est vrai?Parce que ce
First()
n'est pas une méthode deList
. Il est défini dans l'extension Linq pourIEnumerable<>
la source