Преобразуйте этого делегата в анонимном методе или лямбде

Вы всегда можете сделать echo "".

, например

echo "Hello"
echo ""
echo "World"
21
задан abatishchev 24 February 2012 в 22:30
поделиться

4 ответа

Это - известное сообщение об ошибке. Проверьте ссылку ниже на более детальное обсуждение.

http://staceyw1.wordpress.com/2007/12/22/they-are-anonymous-methods-not-anonymous-delegates/

В основном просто необходимо поместить бросок перед анонимным делегатом (лямбда-выражение).

В случае, если ссылка когда-либо понижается, вот копия сообщения:

Они - Анонимные Методы, не Анонимные Делегаты.
Отправленный 22 декабря 2007 staceyw1

Это не просто тема для разговора, потому что мы хотим быть трудными. Это помогает нам рассуждать о том, что точно продолжается. Чтобы быть ясным, существует *никакая такая вещь как анонимный делегат. Они don’t (еще) не существуют. Они - "Анонимные Методы" †“период. Имеет значение в том, как мы думаем о них и как мы говорим о них. Позволяет смотрят на анонимный проект производства работ "делегат () {†¦}". Это - на самом деле две различных операции и когда мы будем думать о нем этот путь, мы никогда не будем смущаться снова. Первая вещь, которую делает компилятор, создают анонимный метод под покрытиями с помощью выведенной подписи делегата в качестве сигнатуры метода. Это не корректно, чтобы сказать, что метод "без имени", потому что это действительно имеет имя, и компилятор присваивает его. Это просто скрыто от нормального представления. Следующая вещь, которую это делает, создают объект делегата необходимого типа обернуть метод. Это называют выводом делегата и может быть источником этого беспорядка. Чтобы это работало, компилятор должен быть в состоянии выяснить (т.е. вывести), какой тип делегата он создаст. Это должен быть известный конкретный тип. Позвольте пишут некоторый код для наблюдения почему.

private void MyMethod()
{
}

не компилирует:

1) Delegate d = delegate() { };                       // Cannot convert anonymous method to type ‘System.Delegate’ because it is not a delegate type
2) Delegate d2 = MyMethod;                         // Cannot convert method group ‘MyMethod’ to non-delegate type ‘System.Delegate’
3) Delegate d3 = (WaitCallback)MyMethod;   // No overload for ‘MyMethod’ matches delegate ‘System.Threading.WaitCallback’

Строка 1 не компилирует, потому что компилятор не может вывести тип делегата. Это может явно видеть подпись, которой мы требуем, но нет никакого конкретного типа делегата, который видит компилятор. Это могло создать анонимный тип делегата типа к нам, но это не работает как этот. Строка 2 не компилирует по подобной причине. Даже при том, что компилятор знает сигнатуру метода, мы не даем ему тип делегата, и это только собирается выбрать то, которое, оказалось бы, работало бы (не, какие побочные эффекты, которые могли иметь). Строка 3 не работает, потому что мы намеренно не соответствовали сигнатуре метода с делегатом, имеющим другую подпись (поскольку WaitCallback берет и объект).

Компиляции:

4) Delegate d4 = (MethodInvoker)MyMethod;  // Works because we cast to a delegate type of the same signature.
5) Delegate d5 = (Action)delegate { };              // Works for same reason as d4.
6) Action d6 = MyMethod;                                // Delegate inference at work here. New Action delegate is created and assigned.

Напротив, они работают. Строка 1 работа, потому что мы говорим компилятор, что тип делегата использовать и они соответствуют, таким образом, это работает. Строка 5 работ по той же причине. Обратите внимание, что мы использовали специальную форму "делегата" без parens. Компилятор выводит сигнатуру метода из броска и создает анонимный метод с той же подписью как выведенный тип делегата. Строка 6 работ, потому что MyMethod () и Действие используют ту же подпись.

я надеюсь, что это помогает.

Также см.: http://msdn.microsoft.com/msdnmag/issues/04/05/C20/

27
ответ дан 29 November 2019 в 21:21
поделиться

Что сказал Mark.

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

, Если это Действительно функционирует, имел, взял Action<>, Action<>... и т.д. перегрузки, Вам не был бы нужен бросок.

3
ответ дан 29 November 2019 в 21:21
поделиться

Попробуйте что-то как:

Expect.Call(delegate { _dao.Save(t); }).Do(new EventHandler(delegate(Transaction t2) { t2.CheckInInfo.CheckInMessage = "I drink goats blood"; }));

Примечание добавленный EventHandler вокруг делегата.

РЕДАКТИРОВАНИЕ: не мог бы работать, так как функциональные подписи EventHandler и делегата не являются тем же... Решением, которое Вы добавили к нижней части своего вопроса, может быть единственный путь.

Поочередно, Вы могли создать универсальный тип делегата:

public delegate void UnitTestingDelegate<T>(T thing);

Так, чтобы делегатом не была конкретная Транзакция.

0
ответ дан 29 November 2019 в 21:21
поделиться

Проблема не с Вашим определением делегата, случается так, что параметр () метод имеет систему типов. Делегат и сгенерированный тип делегата компилятора (FakeSave) неявно не преобразовывают в Систему. Делегат.

Попытка, добавляющая бросок перед Вашим анонимным делегатом:

Expect.Call(delegate { _dao.Save(t); }).Do((Delegate)delegate { t.Message = "I drink goats blood"; });
1
ответ дан 29 November 2019 в 21:21
поделиться
Другие вопросы по тегам:

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