Почему не может использование c# встраивать анонимные лямбды или делегатов? [дубликат]

27
задан Samuel Meacham 22 April 2010 в 02:47
поделиться

3 ответа

Лямбда-выражения в C # не имеют типов, пока они не используются в контексте, который приводит их к типу делегата или выражения. Вот почему вы не можете сказать

var x = () => "some lambda";

Возможно, вам понравится

http://blogs.msdn.com/ericlippert/archive/2007/01/11/lambda-expressions-vs-anonymous-methods-part-two. aspx

http://blogs.msdn.com/ericlippert/archive/2007/01/12/lambda-expressions-vs-anonymous-methods-part-three.aspx

22
ответ дан 28 November 2019 в 05:12
поделиться

Когда вы пишете Func = ... , компилятор знает, что он должен создать объект типа Func <строка> . Но когда вы пишете этот делегат встроенным, компилятор не знает объект, какого типа он должен создать.

Из вышесказанного можно сделать очевидный вывод: просто укажите компилятору явно тип!

Console.WriteLine( new Func<string>( () => "Hello" )() );

ОБНОВЛЕНИЕ

Хорошо, пока я писал ответ, вы обновили свое сообщение. Я считаю, что мой ответ выше уже отвечает на вопрос «зачем нужен этот конкретный тип». Повторюсь: потому что компилятор не знает объект, какого типа создавать.

Теперь немного подробнее о части « компилятор не может вывести сигнатуру анонимного делегата ». Понимаете, это не похоже на JavaScript. В C # нет универсального типа «функция» (или «метод»). У каждого делегата должна быть явно указанная подпись и имя типа. И когда вы создаете делегат, компилятор должен знать, какой тип.

Теперь я понимаю, как вы можете предположить, что компилятор может просто создать тип делегата на лету, как это происходит с анонимными типами объектов (также известными как new {a = 1, b = "xyz"} ). Но задумайтесь на минутку: в любом случае, вероятно, в таком делегате не будет никакой пользы. Я имею в виду, что вы не можете передать его другому методу, потому что этот метод должен сначала объявить типы своих аргументов. И вы можете сделать из этого событие, потому что, опять же, у вас должен быть именованный тип.

Что-то вроде этого ...

9
ответ дан 28 November 2019 в 05:12
поделиться

Вы можете использовать встроенные лямбда-выражения для методов, которые принимают параметр делегата.

Однако есть небольшая загвоздка - если параметр набран как базовый тип делегата, вам нужно будет явно привести его к конкретному производному от делегата (скажем, Action); иначе компилятор пожаловался бы.

Подобные вопросы:
Анонимный метод в вызове Invoke
Анонимные методы и делегаты

2
ответ дан 28 November 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: