为什么我不能在没有初始化器的情况下声明隐式类型的数组?

时间:2017-09-28 15:28:44

标签: c# arrays

当我在没有初始化程序的情况下声明数组int时,为什么必须在new后写num? E.g。

int[] num = new int[5];

对于另一个数组,num1,我先声明了它,然后给它了值,我没有在int之后输入new,就像我为数组num做的那样

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

为什么这个快捷方式对我的第一个例子不起作用?

5 个答案:

答案 0 :(得分:9)

如果提供数组的值,则可以推断出数组的类型(在某些情况下,您的示例已满足)。由于值都是整数,因此编译器能够推断出您需要一个整数数组。如果您没有提供任何值(或者如果值不能全部隐式转换为其中一个值的类型),则无法推断出数组的类型应该是什么,因此您需要指定明确地说。

答案 1 :(得分:7)

"完整"声明值为new int[] {1, 2, 3, 4};的数组的语法。

您的new [] {1, 2, 3, 4};行是一种简写语法。它是一个"隐式输入"阵列。由于值均为int,因此数组会自动声明为int[]

您无法编写int[] x = new [5];的原因很简单,C#设计人员尚未实现此功能。

答案 2 :(得分:3)

因为您似乎期望编译器推断数组类型的方式是基于赋值运算符左侧的类型:

int[] num = new[5];

您的思考过程是:

  1. numint s。
  2. 的数组
  3. new[5]是一系列的东西。
  4. 必须是int,因为这是num的类型。
  5. 这不是编译器的工作方式。编译器必须明确地找出赋值表达式右边的类型,一旦它完成,它将检查左边任何内容的赋值是否有效。

    在C#中允许的语法中,编译器总是有足够的信息来确定赋值右侧的类型(如果有的话)。您提出的语法不会提供该信息。

答案 3 :(得分:2)

在您的第一个场景中,您要声明一个空数组,因此您需要确定它是什么类型。

int[] num = new int[5]; // New empty array of integers with 5 slots.

但是,在第二个示例中,根据您为数组中的插槽分配的值隐含了数组的类型。

int[] num1 = new [] {1, 2, 3, 4}; // New array of integers with 4 slots, already assigned.

上述方法有效,因为数组中的每个元素都属于同一类型。

如果您要执行以下操作,则会出现编译错误,因为无法推断类型,因为元素是不同的类型。

var array = new [] {1, "something"}; // This won't compile.

但是,如果您将其中一个元素声明为公共基类型,那么它会将所有元素存储为该基类型。

var array = new [] {(object)1, "something", DateTime.Now}; // This is an array of objects.

答案 4 :(得分:0)

  

为什么我在使用默认值

声明数组num时必须在new之后编写int

你不是。有许多可能的短序,因为通常编译器可以推断出你正在创建的数组的类型,就像你的情况一样。

所以这是一个非常好的宣言:

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

请注意,此处没有int,但如果您将鼠标悬停在var上,它会告诉您数组是int[]

混合类型时越来越难:

var num1 = new [] { "1", 1 };

然后编译器不知道并强制您指定类型。