C# 集合文字Collection Literals方法 C# 12中[1, 2, 3]是什么

来源:这里教程网 时间:2026-02-21 17:41:54 作者:

方括号
[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[]

相关推荐