我想通过调用在 c# 中创建一个非零下界一维数组
Array.CreateInstance(typeof(int), new int[] { length }, new int[] { lower });
返回数组的类型不是int[],而是int[*]。谁能详细说明这是什么意思?我希望能够将此数组返回给调用者,例如,
int[] GetArray() { ... }
谢谢。
我想通过调用在 c# 中创建一个非零下界一维数组
Array.CreateInstance(typeof(int), new int[] { length }, new int[] { lower });
返回数组的类型不是int[],而是int[*]。谁能详细说明这是什么意思?我希望能够将此数组返回给调用者,例如,
int[] GetArray() { ... }
谢谢。
是的,这是一个陷阱!
向量和一维数组之间存在差异。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[*]
我找不到要验证的实际代码,但试验该语法似乎表明一个具有非零基数的一维数组。
这是我的结果:
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[,]"
如果您只需要一维数组,那么这应该可以解决问题
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