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










