Ответ 1
Это хорошо известное сообщение об ошибке. Подробнее см. Ссылку ниже.
http://staceyw1.wordpress.com/2007/12/22/they-are-anonymous-methods-not-anonymous-delegates/
В основном вам просто нужно поставить бросок перед вашим анонимным делегатом (ваше лямбда-выражение).
Если ссылка когда-либо опускается, вот копия сообщения:
Они являются анонимными методами, а не Анонимные делегаты.
Опубликовано 22 декабря 2007 по staceyw1Это не просто точка разговора, потому что мы хотим быть трудными. Это помогает нам причина в том, что именно происходит. Чтобы быть ясным, нет такой вещи как анонимный делегат. Они не есть (не.). Они "Анонимные Методы" - период. мы думаем о них и о том, как мы говорим о их. Давайте взглянем на анонимный оператор метода "delegate() {...}". Это на самом деле два разных операции и когда мы думаем об этом таким образом, мы никогда не будем путать еще раз. Первое, что компилятор is создает анонимный метод под крышками с использованием выведенных подпись делегата как метод подпись. Неверно сказать метод "неназванный", потому что он имеет имя и компилятор назначает его. Он просто скрыт от нормальный вид. Следующее, что он делает создает объект-делегат требуемый тип для обертывания метода. Эта называется делегированием и может быть источником этой путаницы. Для это для работы, компилятор должен быть (то есть вывести), что тип делегата, который он создаст. В нем есть быть известным конкретным типом. Позволять напишите код, чтобы понять, почему.
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 работает для та же самая причина. Обратите внимание, что мы использовали специальный форма "делегата" без парнеров. Компилятор передает метод подпись от литого и создает анонимный метод с тем же подпись в качестве предполагаемого делегата тип. Строка 6 работает, потому что MyMethod() и Action используют одинаковые подпись.
Надеюсь, это поможет.
Также смотрите: http://msdn.microsoft.com/msdnmag/issues/04/05/C20/