12

我想通过调用在 c# 中创建一个非零下界一维数组

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

返回数组的类型不是int[],而是int[*]。谁能详细说明这是什么意思?我希望能够将此数组返回给调用者,例如,

int[] GetArray() { ... }

谢谢。

4

3 回答 3

15

是的,这是一个陷阱!

向量和一维数组之间存在差异。Anint[]是一个向量。向量(如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[*]
于 2012-08-22T19:27:03.383 回答
3

我找不到要验证的实际代码,但试验该语法似乎表明一个具有非零基数的一维数组。

这是我的结果:

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[,]"
于 2012-08-22T19:26:21.590 回答
2

如果您只需要一维数组,那么这应该可以解决问题

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
于 2012-08-22T19:27:35.650 回答