Not static. The array is a reference object so it is
allocated on heap (and is controlled by the
Garbage Collector). With C++/CLI, which is very unusual compared with other high-level .NET languages, it's also possible to store it on stack or as a static memory. From this moment, let's forget about C++/CLI and manually-coded IL and get back to C#.
Memory allocation is not classified into static and "dynamic". There are
three ways to store an object: in a memory area reserved for static data, on stack and on heap. Now, if you work with a reference object like an array, there are actually two separate objects: a reference and the referenced object itself which is always on heap.
If you consider a reference as an object, if can be stored anywhere: can be static, stack or heap object. It is static if it is a static field; it's on stack if this is a local variable. The other options comes when the reference is a non-static member of something. In this case, the storage of this reference member depends on how the instance of its declaring type is stored. Repeat these considerations recursively, and you will find out how things are stored in each particular case. Again, the referenced object itself does not depend on how reference is stored: it goes on heap.
The managed reference if a very special object. In most cased, you can consider it as a pointer, but this is not a pointer: a referenced object can be relocated, but the reference is maintained valid. If a reference is
reachable from the running code in the application domain, the referenced object cannot be garbage-collected. Please see:
http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29[
^].
—SA