Qué significa System.Double

Esta gem fue creada en un código de interoperabilidad que descomstackmos. No podemos averiguar cómo crear una instancia de esta matriz, ni qué tipo de matriz es.

Al mirar Type.GetElementType me da que es una matriz de tipo Double , pero no podemos entender cómo es diferente de System.Double[] .

Este es un problema de interoperabilidad típico, la matriz se creó en un servidor de automatización COM. Lo que expone la matriz como un SafeArray , el CLR los ubica automáticamente en un objeto de matriz .NET y mantiene su estructura como se especifica en el descriptor de matriz segura.

Una matriz System.Double [] es una clase muy específica de matriz en la CLR, es una “matriz vectorial” que tiene su primer elemento en el índice 0. Este tipo de matrices está muy optimizado en la CLR.

El problema con la matriz que obtuviste es que tiene una dimensión, como una matriz vectorial, pero no tiene su primer elemento en el índice 0. Comúnmente, si interoperas con código escrito en Visual Basic o FoxPro, por ejemplo. Tal código a menudo le gusta iniciar la matriz en el índice 1. Sin embargo, podría ser cualquier cosa.

C # no tiene azúcar de syntax para acceder a dicha matriz, no puede usar el operador [] para indexar la matriz. Tienes que usar los miembros de la clase Array, de forma laboriosa. Asi que:

  • Array.GetLowerBound (0) te dice dónde comenzar a indexar la matriz
  • Array.GetUpperBound (0) te dice qué tan lejos ir
  • Lea un elemento de la matriz con Array.GetValue (índice)

Podría ser más fácil simplemente copiar la matriz:

 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; }