隐式类型数组:为什么我们不能显式设置数组大小

本文关键字:数组 设置 不能 为什么 类型 我们 | 更新日期: 2023-09-27 17:56:41

C#语言规范(7.6.10.4)说,数组创建表达式有树种:

新的非数组类型 [ 表达式列表 ] 秩说明符选项 数组初始化器选项
新的数组类型数组初始值设定项
新的排名说明符数组初始值设定项

第三个用于隐式类型数组:

var foo = new[] { 1, 2, 3 };

问题:在隐式类型数组的情况下,是否有任何重要的理由禁止显式设置数组大小?

它看起来像非对称行为,与以下语法相比:

var foo = new int[3] { 1, 2, 3 };

更新

稍微澄清一下。我可以看到显式设置数组大小和数组初始值设定项组合的唯一优点是对初始值设定项长度的编译时检查。如果我声明了三个int的数组,则初始值设定项必须包含三个int

我认为,隐式类型数组也有同样的优点。当然,利用还是不使用这个优势是个人喜好。

隐式类型数组:为什么我们不能显式设置数组大小

不需要排名说明符,因为它已经由初始化列表中的元素数提供。

我认为这里的一个区别是,这种语法可以看作是首先创建一个类型化数组,然后填充它:

var foo = new int[3] { 1, 2, 3 };

这类似于我们可以在单个语句中声明和初始化其他数据类型的方式:

var list = new List<string>{ "a", "b", "c" };
var dict = new Dictionary<string, string>{ {"a", "b"}, {"c", "d"} };

第一条语句创建、int[3]并填充它。 第二个和第三个语句创建一个List<string>Dictionary<string, string>并填充它们。

但是,如果您这样做:

var foo = new[3] { 1, 2, 3 };

这不是一回事。 没有像[3]这样的数据类型,因此与其他 2 个示例不同,这不是首先创建特定对象并填充它的情况。这是用于创建隐式类型数组的特殊语法,其中数组及其内容是从大括号的内容推断出来的,然后创建。

我不知道为什么这种语法不应该存在,但我认为这是对你认为的不对称的合理解释。