перекрестная нить вызывает проблему компиляции - PullRequest
2 голосов
/ 29 июля 2010

Может кто-нибудь посоветовать, почему эта строка кода не будет компилироваться? Вместо этого он генерирует CS1660:

s.run_button.Invoke((b) => { b.Enabled = false; },
 new object[] { s.run_button });

Visual studio сообщает: «Невозможно преобразовать лямбда-выражение в тип« System.Delegate », потому что это не тип делегата

Ответы [ 2 ]

4 голосов
/ 29 июля 2010

Лямбда-выражения сами по себе не имеют типа и не могут быть преобразованы в System.Delegate. Метод Invoke имеет тип System.Delegate и, следовательно, он не будет компилироваться, поскольку лямбда-выражение не имеет типа. Вам необходимо указать явное преобразование типа здесь

s.run_button.Invoke(
  (Action<Button>)((b) => { b.Enabled = false; }), 
  new object[] { s.run_button });
2 голосов
/ 29 июля 2010

Метод Invoke принимает параметр типа Delegate. Это было написано до того, как лямбды вошли в наш мир. Самое простое решение для вас - обернуть свою лямбду в действие. Я точно не знаю, что это за тип "b" (равно как и компилятор C #, а значит, и ошибка), поэтому вам придется передавать его явно Что-то вроде:

s.run_button.Invoke(new Action<Button>(b => b.Enabled = false), new object[] { s.run_button });
...