проблема компиляции вызова перекрестного потока

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

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

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


person Segfault    schedule 29.07.2010    source источник


Ответы (2)


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

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

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

s.run_button.Invoke(new Action<Button>(b => b.Enabled = false), new object[] { s.run_button });
person Kirk Woll    schedule 29.07.2010
comment
Спасибо, именно то, что мне было нужно. - person Segfault; 29.07.2010