iam currently not sure if you agree with my point or not, maybe this is because of my last "störtebecker scotch-ale" was too strong..
well, for c#, yes (and i think for most other iterative languages as well). the explanation is actually pretty simple, the stackframe, in which the loop is contained in, stays alive and has a reference to the listener and therefore keeps the listener alive if you have a local variable that points to that listener, if not, my point stays valid, its to easy to miss a reference.
this argument is true in both directions i think. my point would be that, if you forget to call dispose (on strong listener), you are responsible of the error (memory leak in most cases). typical c#, event, programming issues and normally any c# dev should be aware of this. YOU SHALL UNREGISTER YOUR EVENTS!
So in regard to my last statement, maybe giving Listen the syntax of an event makes this more clear to a c# dev
so instead of having to write
_field = cell.Listen(value =>
{
//whatever
}
it makes more sence to have
cell.Listen += (value =>
{
//whatever
}
and have listen use strong refs again.
In my opinion this makes it clear to c# devs that you have to unregister events, to clean up ressources. at least they are used to it, i hope…
On a sidenode, i don't like events at all. these make it too easy to make errors as you can see.
So maybe renaming Listen into CreateListener makes it clearer, that something is created, and make this something implement IDisposable (c# devs know they should dispose this instance, may be there is also tooling to support these errors).