方括号 [1, 2, 3]
在 C# 12 中不是集合文字(Collection Literals)
它只是数组字面量(array literal),和 C# 1.0 就有的写法完全一致,**不是新特性**。C# 12 并未引入所谓“集合文字”语法;官方文档和语言提案中从未使用 Collection Literals 这一术语,也未允许
[1, 2, 3]直接创建
List<int></int>、
HashSet<int></int>等非数组集合类型。
new[] {1, 2, 3} 和 [1, 2, 3]
完全等价
两者都推断为
int[],编译后生成相同 IL。区别仅在于语法糖:
[1, 2, 3]是更简洁的数组字面量写法(C# 12 新增) 仍需类型上下文或显式声明才能用于非数组场景,例如:
int[] arr = [1, 2, 3];不能直接赋给
IEnumerable<int></int>变量而不加转换,因为类型推断仍为
int[]不支持初始化器语法扩展(如
[1, 2, 3].Select(x => x * 2)是合法的,但那是因为
int[]实现了
IEnumerable<int></int>,不是“集合文字”能力)
为什么有人误以为这是“集合文字”?
混淆主要来自三方面:
某些博客或视频把[...]笼统称为“集合字面量”,但 C# 语言规范中无此定义 C# 12 确实增强了集合相关功能(如主构造函数中用
params集合参数、改进的集合初始化器),但没改变字面量语义 对比 Python/JavaScript 的
[1, 2, 3]默认创建 list/array 对象,开发者自然期待 C# 也一样——但 C# 坚持类型明确性,
[1, 2, 3]必须绑定到具体数组类型
真想快速构造常见集合,还是得靠已有机制
目前没有语法糖替代这些惯用写法:
new List<int> { 1, 2, 3 }</int> —— 集合初始化器(C# 3 起)
Enumerable.Range(1, 3).ToList()—— 函数式构造
new HashSet<int>(new[] { 1, 2, 3 })</int> —— 数组转集合
若频繁使用,可封装扩展方法,例如:public static List<t> ToList<t>(this T[] arr) => new(arr);</t></t>,然后写
[1, 2, 3].ToList()
真正要注意的是:别在泛型约束或反射场景里假设
[1, 2, 3]是某种抽象集合类型——它永远是具体数组,运行时类型就是
System.Int32[]。
