Каковы ограничения среды выполнения динамического языка в .NET 4.0?

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


person amazedsaint    schedule 20.06.2009    source источник


Ответы (1)


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

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. У меня сложилось впечатление, что вы имели в виду именно это.)

person Jon Skeet    schedule 20.06.2009
comment
Разве не все виды использования делегатов нуждаются в приведении типов, а не только аноны / лямбды? например в btn.Click + = MyClickHandler; если btn является динамическим, но имеет событие Click, это не сработает. Вам понадобится приведение имени метода MyClickHandler. - person Daniel Earwicker; 20.06.2009
comment
@Earwicker: Не все использования делегатов, но вы правы в том, что преобразования групп методов также требуют приведения. Соответственно обновлю свой ответ. - person Jon Skeet; 20.06.2009