Я знаю, что анонимные функции не поддерживаются в качестве аргументов при вызове динамического метода. Каковы еще такие ограничения DLR в .NET 4.0?
Каковы ограничения среды выполнения динамического языка в .NET 4.0?
Ответы (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
Разве не все виды использования делегатов нуждаются в приведении типов, а не только аноны / лямбды? например в btn.Click + = MyClickHandler; если btn является динамическим, но имеет событие Click, это не сработает. Вам понадобится приведение имени метода MyClickHandler.
- person Daniel Earwicker; 20.06.2009
@Earwicker: Не все использования делегатов, но вы правы в том, что преобразования групп методов также требуют приведения. Соответственно обновлю свой ответ.
- person Jon Skeet; 20.06.2009