Вы, вероятно, сделали это, но на всякий случай:
Беспроводная связь: Вы включили беспроводную связь из 'Параметров настройки системы'? Сенсорная панель: снова, Вы посмотрели на Сенсорную панель и Мышь в том же месте?
Лямбды имеют вид изменения времени жизни переменных, которые они захватывают. Например, следующее лямбда-выражение приводит к тому, что параметр p1 становится живым дольше, чем текущий фрейм метода, поскольку к его значению можно получить доступ после того, как фрейм метода больше не находится в стеке
Func<int> Example(int p1) {
return () => p1;
}
Еще одним свойством захваченных переменных является то, что изменения в переменной также видны вне лямбда-выражения. Например, следующие отпечатки 42
void Example2(int p1) {
Action del = () => { p1 = 42; }
del();
Console.WriteLine(p1);
}
Эти два свойства создают определенный набор эффектов, которые противоречат параметру ref, следующим образом
Под капотом анонимный метод реализуется путем подъема захваченных переменных (о чем и идет речь в теле вашего вопроса) и сохранения их в виде полей класса, созданного компилятором. . Невозможно сохранить параметр 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);
}