C#中System.Int32[*]数组类型是什么?能否使用?
关于一维自定义下界数组(System.Int32[*])的说明
1. System.Int32[*]是什么类型?
System.Int32[*]是CLR支持的一维非零基数组类型,和我们常用的int[](零基一维数组)属于不同的数组子类型。
在CLR的类型系统中,数组分为两类:
- 零基数组:比如
int[]、string[],索引固定从0开始,C#语法对其有完整的语法糖支持(直接用[]索引)。 - 非零基数组:包括一维自定义下界数组(类型标识带
[*])和多维自定义下界数组,这类数组的起始索引可指定为任意整数,但C#语法对一维非零基数组的直接支持非常有限。
2. 能否使用System.Int32[*]类型的数组?
可以使用,但无法像常规int[]那样用foo[1]这类语法直接索引,需要通过Array类的内置方法操作:
示例代码:
// 创建起始索引为1、长度为10的一维int数组 var foo = Array.CreateInstance(typeof(int), [10], [1]); // 赋值:调用SetValue(值, 索引) foo.SetValue(100, 1); foo.SetValue(200, 10); // 最大索引为10(1+10-1) // 取值:调用GetValue(索引),需强制转换为对应类型 var val1 = (int)foo.GetValue(1); var val10 = (int)foo.GetValue(10); Console.WriteLine(val1); // 输出100 Console.WriteLine(val10); // 输出200
为什么不能转为int[]?
int[]是CLR专门为零基一维数组定义的类型,和System.Int32[*](非零基一维数组)是完全独立的类型,两者不存在继承或直接转换关系,因此强制转换会抛出InvalidCastException。
额外说明
如果想要更贴近常规数组的操作语法,你可以自己封装简单的包装类,但底层本质还是通过Array的方法来操作非零基数组——这也是你提到的替代方案。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

