[DllImport(...)]
extern static void f(int n, ref double a);

static void Main(){
var a=new double[3]{1,2,3};
f(2, ref a[1]);
}

fはn個の要素を持つ配列を受け取る関数とします。
aの部分配列{2,3}をfに渡したいとして、
x86だと上記のようなやり方で一応正しく動作するのですが、
x64だとa[1]の内容が一時的に別のメモリにコピーされ、
fから戻ってきたときにそのメモリからa[1]にコピーされるので、
{2,3}を渡したことになりません。

質問したいのは、x64ではなぜこのような動作になっているのでしょうか。
普通にa全体を固定してa[1]のアドレスを渡してくれればいいのに、
と思うのですが。