Я собираюсь резюмировать свою проблему в следующем фрагменте кода.
List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());
Выше код работает нормально.
Теперь я попробовал следующее
dynamic dList = list;
Console.WriteLine(dList.First());
но я получаю RuntimeBinderException. Почему это так?
this
здесь динамический, но если вы приземлитесь здесь, вам, вероятно, стоит посмотреть и на этот вопросОтветы:
Чтобы расширить ответ Stecya ... методы расширения не поддерживаются динамической типизацией в форме методов расширения , т.е. вызываются так, как если бы они были методами экземпляра. Однако это будет работать:
Конечно, это может быть полезно, а может и нет. Если бы вы могли предоставить дополнительную информацию о том, почему и как вы пытаетесь использовать динамическую типизацию, возможно, мы сможем вам больше помочь.
источник
dynamic
там, где вам действительно нужно ... в основном, если вы иначе обращались бы к членам с помощью отражения, это большой знак. С другой стороны, я упорный статичный типаж - другие могут предложить менее пессимистичную политику :)Чтобы расширить ответ Джона, причина, по которой это не работает, заключается в том, что в обычных, нединамических методах расширения кода работают, выполняя полный поиск всех классов, известных компилятору, для статического класса, у которого есть соответствующий метод расширения. Поиск идет по порядку в зависимости от вложенности пространств имен и доступных
using
директив в каждом пространстве имен.Это означает, что для правильного разрешения вызова метода динамического расширения DLR каким-то образом должен знать во время выполнения, какие вложения и
using
директивы пространств имен были в вашем исходном коде . У нас нет удобного механизма для кодирования всей этой информации на сайте вызова. Мы думали об изобретении такого механизма, но решили, что это слишком дорого и сопряжено со слишком большим риском для графика, чтобы того стоить.источник
dynamic
объекты равны C # :DynamicObject
, поэтому нет возможности их различать, и это одна из причин, по которой невозможно добавить методы расширенияdynamic
, верно?Потому что
First()
это не методList
. Он определен в расширении Linq дляIEnumerable<>
источник