C# и глюки с замыканиями
Aug. 14th, 2010 06:02 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Я где-то сошел с ума, но с ходу не соображу где.
Есть такой код с замыканиями:
Т.е. я пытаюсь сделать следующее: создать список функций без параметров, которые при вызове будут выдавать результаты от a до f. Это вообще имитация другого, рабочего кода, но суть та же самая.
А теперь внимание, ШИЗА: этот код выдает "f f f f f f", а не то, что я от него хочу ("a b c d e f"). Т.е. делегаты в списке каким-то чудесным образом начинают ссылаться не 6 разных экземпляров замыканий, а на один.
Что-то мне это начинает необъяснимо напоминать недавний пост
alexclear про JavaScript, я сейчас для смеха попробую тамошний workaround.
PS: Жопа, workaround оттуда сработал. В кошмарном сне бы такое не привиделось, что непонятный пост про совершенно неизвестный мне язык через неделю окажется пригодным в работе.
PPS: Оказывается, известная шиза - переменная цикла s объявлена один раз и до цикла, и замыкается оно на нее.
Есть такой код с замыканиями:
class Program { delegate void ZeroArityFunc(); static string[] testData=new string[] { "a", "b", "c", "d", "e", "f" }; static void Main(string[] args) { Listlist = new List (); foreach(string s in testData) { ZeroArityFunc f = () => Console.Write(s); //создаем лямбду и присваиваем ее f list.Add(f); } foreach(ZeroArityFunc a in list) { a(); } } }
Т.е. я пытаюсь сделать следующее: создать список функций без параметров, которые при вызове будут выдавать результаты от a до f. Это вообще имитация другого, рабочего кода, но суть та же самая.
А теперь внимание, ШИЗА: этот код выдает "f f f f f f", а не то, что я от него хочу ("a b c d e f"). Т.е. делегаты в списке каким-то чудесным образом начинают ссылаться не 6 разных экземпляров замыканий, а на один.
Что-то мне это начинает необъяснимо напоминать недавний пост
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
PS: Жопа, workaround оттуда сработал. В кошмарном сне бы такое не привиделось, что непонятный пост про совершенно неизвестный мне язык через неделю окажется пригодным в работе.
PPS: Оказывается, известная шиза - переменная цикла s объявлена один раз и до цикла, и замыкается оно на нее.
no subject
Date: 2010-08-14 11:26 pm (UTC)using int = System.Int32;
не?