System.Double [*]是什么意思

时间:2014-04-17 06:17:09

标签: c# .net c++-cli

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

查看Type.GetElementType告诉我它是Double类型的数组,但我们无法弄清楚它与System.Double[]的区别。

1 个答案:

答案 0 :(得分: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;
}