2009-12-05 2 views
1

У меня есть этот код:Как я могу сделать эту работу лямбдой?

 String temp = txtForm.Rtf; 

     foreach (ReplaceStrut rs in replaceArray) { 
      temp = temp.Replace(rs.getNeedle(), rs.getReplacement()); 
     } 
     if (this.InvokeRequired) { 
      this.Invoke(temp => txtForm.Rtf = temp); 
     } else { 
      txtForm.Rtf = temp; 
     } 

Но это не будет компилироваться. Он жалуется на две вещи: «Невозможно преобразовать лямбда-выражение в тип« System.Delegate », потому что это не тип делегата» и «Локальная переменная с именем« temp »не может быть объявлена ​​в этой области, потому что это придаст различие 'temp', который уже используется в области «родительский или текущий» для обозначения чего-то еще »

Обе ошибки находятся на линии лямбда. Как я могу сделать эту работу, что я делаю неправильно?

ответ

5
this.Invoke(new Action(() => txtForm.Rtf = temp)) 
+0

Никогда не видел синтаксис, используемый следующим образом: p Не уверен, нравится мне это или нет. – leppie

+1

Синтаксис 'new Action (() => ...)' идентичен в терминах сгенерированного IL на '(Action) (() => ...)'. –

0
this.Invoke((Action)() => txtForm.Rtf = something); // where something is free 
+1

это не совсем подходит. Я узнал, что у lamba есть доступ к текущим переменным области, поэтому передача его темпам не требуется. Исправьте свой ответ, и я пометю его как правую. – Malfist

+0

Хорошая точка :) Очевидно, нужно будет принять следующий аргумент: p – leppie

+0

Нет, вам нужно использовать temp, а не «что-то». Кое-что не имеет ни сферы, нужно пройти. – Malfist

6

«не может преобразовать лямбда-выражения к типу„System.Delegate“, потому что это не тип делегата» ошибка происходит потому, что лямбда-выражения не имеют типов. Компилятор обычно выводит тип из цели назначения, но это невозможно с Invoke, потому что он принимает System.Delegate. Выделение лямбда-выражения решит эту проблему.

Не нужно объявлять temp в качестве параметра вашего выражения лямбда. Выражение будет иметь возможность ссылаться на temp из области содержимого.

Изменить Invoke линию к следующему, и он должен работать:

this.Invoke((Action)(() => txtForm.Rtf = temp)); 

Убедитесь, что вы ссылаетесь на System.Core сборку для вышеуказанной линии, в противном случае вы получите сообщение об ошибке сказав «Использование универсального типа ' System.Action требует «аргументов типа 1».

+0

+1 для объяснения – Davy8

Смежные вопросы