System.Double[*]是什么意思

本文关键字:是什么 意思 Double System | 更新日期: 2023-09-27 17:58:46

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

看看Type.GetElementType,我会发现它是一个类型为Double的数组,但我们无法弄清楚它与System.Double[]有何不同。

System.Double[*]是什么意思

这是一个典型的互操作问题,数组是在COM Automation服务器中创建的。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;
}