It works the way you expected it to work, certainly it is. A fixed property is associated with a pointer variable, and not with the object that it binds. Thus, inside the internal block of visibility, there are two variables that bind the array. Then one of them contains one variable that binds it. It is still fixed.
When you recurs and the array is declared outside the method, then there will be many other variables that bind it.
A decent mental image should work from the assumption that the fixed initializes the GCHandle for the object. You can create as many GCHandles for an object as you dare, GC doesn't mind. This does not actually happen at run time, it is fixed much more efficiently than GCHandle. This is a variable attribute, shown as [pinned] in a disassembler such as ildasm.exe. The GC detects an attribute as it walks along the glass, looking for references to objects.
Hans passant
source share