Ok. Ostatnio Visual Studio rzuciło mi błędem "Cannot use ref or out parameter 'x' inside an anonymous method, lambda expression, or query expression". Nigdy wcześniej się z tym nie spotkałem, więc postanowiłem to zbadać.
Okazuje się, że wyrażenia lambda mają swój własny cykl życia zmiennych. Zmienne są trzymane w wyrażeniach lambda, nawet wtedy, kiedy ich zakres powinien się już skończyć i GC powinien je zgarnąć. Dlatego, gdybyśmy przekazali zmienną przez ref, moglibyśmy
@Maav: Nie udało mi się doprowadzić do działania tego na refach. (W sumie nie potrzebowałem tego refa, więc mogłem go wyrzucić w moim kodzie i się nie przejmować). Za to pobawiłem się chwilę i ze wskaźnikami już działa. Może jeszcze w wolnym czasie postaram się to zepsuć, żeby rzuciło mi wyjątkiem czy coś.
unsafepublicvoid TestMethod(int* x) { int y = 1; boolDel = () => { return y == *x; }; intDel = () => { y *= 2; return
@Maav: Szczerze mówiąc o cyklu życia zmiennych w funkcjach lambda czytałem w jakimś poradniku dla początkujących, więc nie wiem na ile to odkrywcza a na ile podstawowa wiedza. Tak czy siak plus za opisanie tego.
Okazuje się, że wyrażenia lambda mają swój własny cykl życia zmiennych. Zmienne są trzymane w wyrażeniach lambda, nawet wtedy, kiedy ich zakres powinien się już skończyć i GC powinien je zgarnąć. Dlatego, gdybyśmy przekazali zmienną przez ref, moglibyśmy
unsafepublicvoidTestMethod(int* x)
{
inty = 1;boolDel = () => {
returny == *x; };intDel = () => { y *= 2;
return