发布于2026-07-19 阅读(0)
扫一扫,手机访问
说到C#数组初始化,最常见的方式就是在声明时直接赋值。但别小看这一步,类型推断里其实藏着不少坑。

声明时直接赋值初始化,最常见也最直观。比如 int[] arr = new int[] { 1, 2, 3 };,用 new 关键字加大括号,一气呵成。C# 还支持省略类型声明,写成 var arr = new[] { 1, 2, 3 };,编译器会根据初始值自动推断为 int[]。但注意,这里有个陷阱:所有元素必须是同一类型,或者能隐式转换为同一类型,否则编译直接报错。比如 new[] { 1, "hello" } 就会提示 Cannot infer array type。
还有一种常见误操作是混用数值和 null,比如 new[] { 42, null }。编译器会将它推断为 object[],而不是预期的 int? 或 string。后续使用很容易引发装箱或空引用异常,这点需要格外当心。
new T[n],不能省略类型如果只确定数组长度,内容稍后填充,那就必须显式写出类型。比如 string[] names = new string[5];。这里不能写成 var names = new string[5];,语法上就不允许,因为编译器无法从长度推断元素类型。
这种初始化方式下,所有元素会被自动设为默认值:数值类型为 0,bool 为 false,引用类型为 null。如果想让初始值统一为某个自定义内容,比如全部填 "N/A",那就得手动循环赋值,或者用 .NET 5+ 提供的 Array.Fill() 方法:
Array.Fill(names, "N/A");for (int i = 0; i < names.Length; i++) 来逐个赋值。C# 不支持直接用集合初始化器({ ... })来初始化普通数组。像 int[] a = { 1, 2, 3 }; 看似简洁,其实只是编译器提供的语法糖——仅在声明并初始化同时发生时有效。一旦拆成两步就会报错:
int[] a;
a = { 1, 2, 3 }; // ❌ 编译错误:期望 ; 或 =
正确的写法只能是 a = new int[] { 1, 2, 3 }; 或 a = [1, 2, 3];(C# 12 的数组字面量语法,但要求目标类型已知)。
另外,集合初始化器对多维数组也无效。比如 int[,] m = { {1,2}, {3,4} }; 是非法的,必须写成 new int[,] { {1,2}, {3,4} }。
Enumerable.Repeat 或 Enumerable.Range:适合特定场景当需要按规律生成数组,比如全零数组、递增序列或重复值,LINQ 提供了一种更函数式的写法。但要注意性能和类型问题:
int[] zeros = Enumerable.Repeat(0, 100).ToArray(); —— 创建含 100 个 0 的 int[]int[] range = Enumerable.Range(1, 10).ToArray(); —— 创建 [1..10] 的序列这些方法返回的是 IEnumerable,调用 ToArray() 才真正生成数组。频繁调用会产生额外的 GC 压力,在简单场景下反而不如传统 for 循环高效。另外,Repeat 的第一个参数是值而非表达式,不能写成 Repeat(new object(), n) 来生成多个独立对象实例——所有元素会指向同一个引用。
数组初始化看起来简单,但类型推断规则、语法糖的适用边界,以及 LINQ 与原生数组的语义差异,都是实际编码中最容易悄悄出错的地方。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8