С#: Array.CreateInstance: невозможно сбрасывать объект типа [*], чтобы ввести []

Я хочу создать ненулевой нижний одномерный массив в С#, вызвав

Array.CreateInstance(typeof(int), new int[] { length }, new int[] { lower });

Тип возвращаемого массива не int [], а int [*]. Может ли кто-нибудь уточнить, что это значит? Я хочу, чтобы вернуть этот массив вызывающему, например,

int[] GetArray() { ... }

Спасибо.

Ответ 1

Да, это уже есть!

Существует разница между вектором и 1-мерным массивом. int[] - вектор. Вектор (например, int[]) должен быть основан на 0. В противном случае вы должны называть его Array. Например:

// and yes, this is doing it the hard way, to show a point...
int[] arr1 = (int[]) Array.CreateInstance(typeof(int), length);

или (отметив, что это все еще основано на нуле):

int[] arr2 = (int[]) Array.CreateInstance(typeof (int),
      new int[] {length}, new int[] {0});

Если ваш массив не может быть основан на 0, то извините: вы должны использовать Array, а не int[]:

Array arr3 = Array.CreateInstance(typeof(int),
      new int[] { length }, new int[] { lower });

Чтобы сделать его еще более запутанным, существует разница между:

typeof(int).MakeArrayType() // a vector, aka int[]
typeof(int).MakeArrayType(1) // a 1-d array, **not** a vector, aka int[*]

Ответ 2

Я не могу найти фактический код для проверки, но эксперимент, который синтаксис, похоже, указывает на одномерный массив с ненулевой базой.

Здесь мои результаты:

0-Based 1-D Array :        "System.Int32[]"
Non-0-based 1-D Array:     "System.Int32[*]"
0-based 2-D Array :        "System.Int32[,]"
Non-0-based 2-D Array :    "System.Int32[,]"

Ответ 3

Если вам нужен только одномерный массив, это должно сделать трюк

Array.CreateInstance(typeof(int), length)

Когда вы укажете lowerBound, тогда возвращаете тип, если он отличается от другого

var simpleArrayType = typeof(int[]);

var arrayType = Array.CreateInstance(typeof(int), 10).GetType();
var arrayWithLowerSpecifiedType = Array.CreateInstance(typeof(int), 10, 5).GetType();

Console.WriteLine ( arrayType == simpleArrayType ); //True
Console.WriteLine ( arrayWithLowerSpecifiedType == simpleArrayType ); //False