Лямбда-выражения в C # не имеют типов, пока они не используются в контексте, который приводит их к типу делегата или выражения. Вот почему вы не можете сказать
var x = () => "some lambda";
Возможно, вам понравится
Когда вы пишете Func
, компилятор знает, что он должен создать объект типа Func <строка>
. Но когда вы пишете этот делегат встроенным, компилятор не знает объект, какого типа он должен создать.
Из вышесказанного можно сделать очевидный вывод: просто укажите компилятору явно тип!
Console.WriteLine( new Func<string>( () => "Hello" )() );
ОБНОВЛЕНИЕ
Хорошо, пока я писал ответ, вы обновили свое сообщение. Я считаю, что мой ответ выше уже отвечает на вопрос «зачем нужен этот конкретный тип». Повторюсь: потому что компилятор не знает объект, какого типа создавать.
Теперь немного подробнее о части « компилятор не может вывести сигнатуру анонимного делегата ». Понимаете, это не похоже на JavaScript. В C # нет универсального типа «функция» (или «метод»). У каждого делегата должна быть явно указанная подпись и имя типа. И когда вы создаете делегат, компилятор должен знать, какой тип.
Теперь я понимаю, как вы можете предположить, что компилятор может просто создать тип делегата на лету, как это происходит с анонимными типами объектов (также известными как new {a = 1, b = "xyz"}
). Но задумайтесь на минутку: в любом случае, вероятно, в таком делегате не будет никакой пользы. Я имею в виду, что вы не можете передать его другому методу, потому что этот метод должен сначала объявить типы своих аргументов. И вы можете сделать из этого событие, потому что, опять же, у вас должен быть именованный тип.
Что-то вроде этого ...
Вы можете использовать встроенные лямбда-выражения для методов, которые принимают параметр делегата.
Однако есть небольшая загвоздка - если параметр набран как базовый тип делегата, вам нужно будет явно привести его к конкретному производному от делегата (скажем, Action); иначе компилятор пожаловался бы.
Подобные вопросы:
Анонимный метод в вызове Invoke
Анонимные методы и делегаты