Здравствуйте, BogdanMart, Вы писали:
BM>Както по дебильному немерле генерит замыкания
Все генерируется верно. У тебя просто ошибка в коде:
BM>BM> OnPropertyChanged((param.Name : string));
BM>
BM>2) Зачем вообще создавать класс _N__N_lambda__8057__8075, C# создает в таком случаае приватный метод с рандомным именем, и подписывает на событие делегат на этот метод.
Н1 генерирует функциональный объект при следующих условиях:
1. Функция используется как функция высшего порядка (ФВП) — это как раз твой случай.
2. Функция используется более одного раза и при этом она захватывает внешний контекст (создает замыкание).
К сожалению, компилятор Н1 иногда осторожничает и делает функциональным объектом то что можно было бы сделать методом. Это не доработка, но исправление ее осложнено тем, что код там очень мутный. В Н2 можно довести этот вопрос до совершенства.
BM>Я бы не возущался... но есть один нюанс, мы используем WeakDelegatе и по этому _N__N_lambda__8057__8075 запроста уберется сборщиком мусора... очень печально.
Ну, дык, как правильно тебе сказал Ziaw ты делаешь слишком смелые предположения (и на шарпе тоже). Работа твоего кода будет зависеть от фазы луны. Так что просто помести ссылку на лямбду в поле того объекта время жизни которого которого должно перекрывать время жизни лямбды.
BM>Это создавать целый метод для такой тривиальной задачи... а шарп справлялся...
Создание метода тоже не очень хорошее решение, так как код будет зависеть от реализации. Лучше просто сделай явную ссылку. Это стопроцентная гарантия.
Здравствуйте, VladD2, Вы писали:
VD>Все генерируется верно. У тебя просто ошибка в коде:
BM>>BM>> OnPropertyChanged((param.Name : string));
BM>>
Да, это я заметил:
BM>> Про замыкание для гуида вопрос снимаеться... забылся поставить $ перед (param.Name : string)
(первый ответ на пост)
Но в целом, да. Ты прав! как-то тупонул.