Ответ 1
Интересный вопрос.
Сначала рассмотрим разницу между анонимными методами и лямбдами. С точки зрения писателя компилятора наиболее важным отличием является то, что lambdas может потребовать от компилятора указать тип параметров из целевого объекта, которому назначается лямбда; У анонимных методов С# 2 эта функция отсутствует. Эта функция кажется небольшой разницей, но на самом деле она имеет серьезные последствия для реализации компилятора. См. Мою серию блога на эту тему для некоторых мыслей о том, почему это:
Итак, теперь давайте приступим к вашему фактическому вопросу: почему мы не можем выводить оттуда /refness от целевого типа к параметрам лямбда. То есть, если мы делегируем void D (out int x), то, конечно, D d = x = > {x = 10; } можно сделать вывод, что x является "out int".
Нет никакой технической причины, я знаю, почему мы не могли этого сделать. Внутренне в компиляторе типы out/ref представлены как типы, подобные любым другим.
Однако функции не могут быть выполнены только потому, что они могут быть выполнены; они делаются, потому что есть веские основания для этого. Для lambdas неотразимая причина делать вывод типа в первую очередь - LINQ; мы хотим иметь возможность сделать простое синтаксическое преобразование при понимании запроса в вызове метода с помощью lambdas, и пусть механизм вывода типа метода задает типы всех параметров лямбда. Ни один из созданных методов LINQ не имеет делегатов с параметрами out или ref.
Итак, у нас нет веских оснований делать эту функцию. Делегаты, у которых есть параметры /ref, относительно редки. И назначение лямбда этим делегатам еще реже. Так что это особенность, которая нам не нужна, и это почти ничего не дает.
С# 3 был "длинным полюсом" в расписании Visual Studio; у нас было самое большое количество дней работы, запланированных для любой команды, которая отправляет компонент в VS. Это означало, что каждый день мы списывали расписание, все подразделение поскользнулось. Это было мощным препятствием для того, чтобы тратить время на ненужные функции, которые никому не приносили пользу. Таким образом, работа не была выполнена.
Я согласен с тем, что было бы неплохо быть более последовательным здесь, но это вряд ли произойдет. У нас много приоритетов.