Подтвердить что ты не робот

С# generics - зачем работать лямбда, когда нет простых методов?

У меня возникли проблемы с пониманием того, почему компилятор С# может вызывать типы для

Array.ConvertAll(new int[1], i => Convert.ToDouble(i));

но не для

Array.ConvertAll(new int[1], Convert.ToDouble);

когда казалось бы, что первый будет более сложным выводом, чем последний.

Может кто-нибудь объяснить, почему это происходит?

4b9b3361

Ответ 1

Эта проблема довольно хорошо освещена в этом (архивированном) сообщении блога: http://blogs.msdn.com/b/ericlippert/archive/2007/11/05/c-3-0-return-type-inference-does-not-work-on-member-groups.aspx

Вкратце, как я понимаю (если связь когда-либо исчезнет); это было сознательное дизайнерское решение в С# 3.0, поскольку было нецелесообразно выполнять вывод типа в группах методов (ваш второй пример).

Я думаю, довольно многим людям это не понравилось, поэтому проблема была решена для С# 4.0 (как и Visual Studio 2010);

"В С# 4.0 вывод возвращаемого типа работает с аргументами группы методов, когда группа методов может быть однозначно ассоциирована с полностью фиксированным набором типов аргументов, выведенным из делегата. Как только типы аргументов, связанные с группой методов, известны, тогда разрешение перегрузки может однозначно определить, какой метод в группе методов является тем, который связан с формальным параметром делегата, и затем мы можем сделать вывод возвращаемого типа от конкретного метода до типа возвращаемого делегата."