It is well-known that C# implements closures by capturing the local variables of the parent methods into a class which contains the lambda / anonymous method, and these variables it is accessing.
An alternative approach, taken by Pascal, is by passing the address of the stack frame of the parent (actually, the addresses of the stack frames of all parents) to the nested / anonymous function (link).
The second approach is very likely more efficient in terms of performance (link). There is no need for allocations and load on GC, and it might be even more cache-friendly due to the native locality of the stack. The performance impact of closures is recognized by Microsoft and lead to (static anonymous functions)[https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-9.0/static-anonymous-functions].
My question is: why did C# / CLR designers opted for capturing local variables using a class instead of just passing the stack frames of their parents? Accessing parent's stack is not a problem: ref parameters are a clear example that is it allowed, and possible.