为什么可以';t我使用与数组声明分离的数组初始化语法

本文关键字:数组 声明 分离 语法 初始化 为什么 | 更新日期: 2023-09-27 18:25:00

我可以用一个整数来完成:

int a;
a = 5;

但我不能用整数数组:

int[] a;
a = { 1, 2, 3, 4, 5 };

为什么不呢?

为了澄清,我不是在寻找正确的语法(我可以查找);我知道这是有效的:

int[] a = { 1, 2, 3, 4, 5 };

相当于:

int a = 5;

我试图理解的是,为什么数组的代码会失败?代码未被识别为有效的原因是什么?

为什么可以';t我使用与数组声明分离的数组初始化语法

之所以存在差异,是因为当在同一语句中声明初始化数组时,Microsoft的人员决定简化语法,但没有添加所需的语法,以便稍后为其分配新数组。

这就是为什么它有效:

int[] a = { 1, 2, 3, 4, 5 };

但这不是:

int[] a;
a = { 1, 2, 3, 4, 5 };

他们会添加语法来允许这样做吗?当然,但他们没有。最有可能的是,他们觉得这个用例很少使用,所以不需要优先考虑其他功能。所有新功能的起点都是负100分,这可能只是在优先级列表中排名不够高。

注意,{ 1, 2, 3, 4, 5 }本身没有任何意义;它只能出现在两个地方:

  • 作为数组变量声明的一部分:

      int[] a = { 1, 2, 3, 4, 5 };
    
  • 作为数组创建表达式的一部分:

      new int[] { 1, 2, 3, 4, 5 }
    

另一方面,数字5在C#中出现的任何地方都有意义,这就是为什么它有效:

int a;
a = 5;

因此,这只是C#的设计者决定支持的特殊语法,仅此而已。

C#规范第12.6节"数组初始化器"中记录了此语法。

数组示例不起作用的原因是值类型和引用类型之间的差异。int是一种值类型。它是内存中的一个位置,其值可以更改。

您的整数数组是引用类型。它并不等同于内存中的恒定字节数。因此,它是一个指向存储该数据的字节的指针。

在第一行中,将null分配给a

int[] a;

在下一行中,如果要更改数组的值,则需要将其分配给一个新数组。

a = new[] {1, 2, 3, 4, 5};

这就是为什么如果您强烈键入声明,那么在数组中的值列表之前需要new[]

int[] a = {1, 2, 3, 4, 5}; // This will work.
var a = {1, 2, 3, 4, 5}; // This will not.

然而,正如许多其他答案所说,如果您在一行中声明它,则不需要new[]。如果将声明和初始化分开,则需要使用new[]

{}语法可用于数组初始化,在声明后不使用。

要初始化数组,您应该这样尝试:

int[] a = { 1, 2, 3, 4, 5 };

初始化一维阵列的其他方法:

int[] a = new int[] { 1, 2, 3, 4, 5 };
int[] a = new int[5] { 1, 2, 3, 4, 5 };

看看这个:初始化不同类型数组的不同方法