Метод расширения и динамический объект

Я собираюсь обобщить мою проблему на следующий фрагмент кода.

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

Над кодом работает нормально.

Теперь я попробовал следующее

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

но я получаю RuntimeBinderException.Почему это так?

Ответ 1

Чтобы расширить метод ответа Stecya..., методы расширения не поддерживаются динамической типизацией в форме методов расширения, т.е. называются так, как если бы они были методами экземпляра. Однако это будет работать:

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

Конечно, это может быть или не быть полезным. Если вы могли бы дать больше информации о том, почему и как вы пытаетесь использовать динамическую типизацию, мы можем помочь больше.

Ответ 2

Чтобы развернуть ответ Джона, причина, по которой это не работает, заключается в том, что в обычных, нединамических методах расширения кода работает, выполняя полный поиск всех классов, известных компилятору для статического класса, который имеет метод расширения который соответствует. Поиск выполняется в порядке, основанном на вложенности пространств имен и доступных директивах using в каждом пространстве имен.

Это означает, что для того, чтобы вызвать динамический вызов метода расширения, правильно разрешен, DLD должна знать во время выполнения, что все вложения имен и директивы using были в вашем исходном коде. У нас нет механизма для кодирования всей этой информации на сайт вызова. Мы считали, что изобретаем такой механизм, но решили, что он слишком дорогостоящий и создает слишком большой риск для того, чтобы его стоило.

Ответ 3

Потому что First() не метод List. Он определен в Linq Extension для IEnumerable<>