System.Double [*]是什么意思

Aro*_*ron 4 .net c# c++-cli

这个gem是在我们反编译的一些互操作代码中创建的.我们无法弄清楚如何创建这个数组的实例,也不知道它是什么类型的数组.

看着Type.GetElementType给我的是它是一个类型的数组Double,但我们无法弄清楚它是如何不同的System.Double[].

Han*_*ant 14

这是一个典型的互操作问题,该阵列是在COM自动化服务器中创建的.将数组公开为SafeArray,CLR会自动将它们封送到.NET数组对象并维护其在安全数组描述符中指定的结构.

System.Double []数组是CLR中一种非常特殊的数组,它是一个"向量数组",其第一个元素在索引0处.这些类型的数组在CLR中进行了大量优化.

您获得的数组的问题在于它有一个维度,如向量数组,但在索引0处没有它的第一个元素.例如,如果您使用Visual Basic或FoxPro编写的代码互操作,则常见.这样的代码经常喜欢在索引1处启动数组.但是可能是任何东西.

C#没有语法糖来访问这样的数组,你不能使用[]运算符来索引数组.您必须轻松地使用Array类的成员.所以:

  • Array.GetLowerBound(0)告诉您从哪里开始索引数组
  • Array.GetUpperBound(0)告诉你要走多远
  • 使用Array.GetValue(index)从数组中读取元素

可以更容易地复制数组:

public static double[] ConvertDoubleArray(Array arr) {
    if (arr.Rank != 1) throw new ArgumentException();
    var retval = new double[arr.GetLength(0)];
    for (int ix = arr.GetLowerBound(0); ix <= arr.GetUpperBound(0); ++ix)
        retval[ix - arr.GetLowerBound(0)] = (double)arr.GetValue(ix);
    return retval;
}
Run Code Online (Sandbox Code Playgroud)