Не может использовать касательно или параметр в лямбда-выражениях

Вы, вероятно, сделали это, но на всякий случай:

Беспроводная связь: Вы включили беспроводную связь из 'Параметров настройки системы'? Сенсорная панель: снова, Вы посмотрели на Сенсорную панель и Мышь в том же месте?

161
задан Colonel Panic 21 March 2018 в 14:25
поделиться

2 ответа

Лямбды имеют вид изменения времени жизни переменных, которые они захватывают. Например, следующее лямбда-выражение приводит к тому, что параметр p1 становится живым дольше, чем текущий фрейм метода, поскольку к его значению можно получить доступ после того, как фрейм метода больше не находится в стеке

Func<int> Example(int p1) {
  return () => p1;
}

Еще одним свойством захваченных переменных является то, что изменения в переменной также видны вне лямбда-выражения. Например, следующие отпечатки 42

void Example2(int p1) {
  Action del = () => { p1 = 42; }
  del();
  Console.WriteLine(p1);
}

Эти два свойства создают определенный набор эффектов, которые противоречат параметру ref, следующим образом

  • параметры ref могут иметь фиксированное время жизни. Рассмотрите возможность передачи локальной переменной в качестве параметра ссылки функции.
  • Побочные эффекты лямбда-выражения должны быть видны в самом параметре ref. И внутри метода, и в вызывающем.
117
ответ дан 23 November 2019 в 21:26
поделиться

Под капотом анонимный метод реализуется путем подъема захваченных переменных (о чем и идет речь в теле вашего вопроса) и сохранения их в виде полей класса, созданного компилятором. . Невозможно сохранить параметр ref или out в качестве поля. Эрик Липперт обсуждал это в записи блога . Обратите внимание, что есть разница между захваченными переменными и лямбда-параметрами. Вы можете иметь «формальные параметры», подобные приведенным ниже, поскольку они не являются фиксируемыми переменными:

delegate void TestDelegate (out int x);
static void Main(string[] args)
{
    TestDelegate testDel = (out int x) => { x = 10; };
    int p;
    testDel(out p);
    Console.WriteLine(p);
}
81
ответ дан 23 November 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: