С#: 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