Каковы ограничения Dynamic Language Runtime в .NET 4.0? - PullRequest
6 голосов
/ 20 июня 2009

Я знаю, что анонимные функции не поддерживаются в качестве аргументов для динамического вызова метода. Каковы другие подобные ограничения DLR в .NET 4.0?

1 Ответ

11 голосов
/ 20 июня 2009

Вы можете использовать анонимные функции, вам просто нужно сначала привести их:

dynamic list = new List<string>() { "10", "20" };
dynamic converted = list.ConvertAll((Func<string, int>) (x => int.Parse(x)));

То же самое верно для преобразований групп методов:

foo.Click += (EventHandler) MyClickHandler;

Другие ограничения, с которыми я сталкивался до сих пор:

  • Статические методы и конструкторы не могут быть динамическими в терминах типа, но может быть динамическими в терминах аргументов
  • Вы не можете использовать dynamic в ограничении типов
  • Вы не можете использовать dynamic в качестве аргумента типа в интерфейсе для объявления класса, но вы можете использовать его в качестве аргумента типа для базового класса, т.е.

    class Invalid : IEnumerable<dynamic>
    class Valid : List<dynamic>
    
  • Методы расширения не могут быть обнаружены во время выполнения (но вы можете вызывать статический метод напрямую с динамическими аргументами)

  • В 4.0b1 есть ошибка, из-за которой вы не можете конвертировать из dynamic[] в IEnumerable<dynamic> - это будет исправлено в релизе.
  • Вы не можете использовать dynamic в качестве базового класса

(Обратите внимание, что это ограничения C # 4.0 в той же степени, что и самого DLR. У меня сложилось впечатление, что именно это вы и имели в виду.)

...