Как я могу заставить эту лямбду работать? - PullRequest
1 голос
/ 05 декабря 2009

У меня есть этот код:

        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», который уже используется в «родительской или текущей» области для обозначения чего-то другого "

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

Ответы [ 3 ]

6 голосов
/ 05 декабря 2009

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

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

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

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

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

5 голосов
/ 05 декабря 2009
this.Invoke(new Action(() => txtForm.Rtf = temp))
0 голосов
/ 05 декабря 2009
this.Invoke((Action) () => txtForm.Rtf = something); // where something is free
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...