![](/img/trans.png)
[英]Why can't I use the array initializer with an implicitly typed variable?
[英]Why can't I declare an implicitly typed array without an initializer?
当我在没有初始化程序的情况下声明数组num
时,为什么我必须在new
之后编写int
? 例如
int[] num = new int[5];
对于另一个数组num1,
我先声明它然后给它赋值,并且我没有像new
的数组num
那样输入int
。
int[] num1 = new [] {1, 2, 3, 4};
为什么这个快捷方式对我的第一个例子不起作用?
如果提供数组的值,则可以推断出数组的类型(在某些情况下,您的示例已满足)。 由于值都是整数,因此编译器能够推断出您需要一个整数数组。 如果您没有提供任何值(或者如果值不能全部隐式转换为其中一个值的类型),则无法推断出数组的类型应该是什么,因此您需要指定明确地说。
使用值声明数组的“完整”语法是new int[] {1, 2, 3, 4};
。
你的new [] {1, 2, 3, 4};
line是一种简写语法。 它是一个“隐式类型”数组。 因为值都是int
,所以数组自动声明为int[]
。
你不能写int[] x = new [5];
很简单,这个功能还没有被C#设计者实现。
因为您似乎期望编译器推断数组类型的方式基于赋值运算符左侧的类型:
int[] num = new[5];
你的思考过程是:
num
是一个int
数组。 new[5]
是一系列的东西。 int
,因为这是num
的类型。 这不是编译器的工作方式。 编译器必须明确地找出赋值表达式右边的类型,一旦它完成,它将检查对左边的任何内容的赋值是否有效。
在C#中允许的语法中,编译器总是有足够的信息来确定赋值右侧的类型(如果有的话)。 您提出的语法不会提供该信息。
在您的第一个场景中,您声明了一个空数组,因此您需要确定它是什么类型。
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.
当我用默认值声明数组num时,为什么我必须在new之后编写int
你没有。 有许多可能的缩写,因为编译器通常可以推断出您正在创建的数组的类型 ,就像您的情况一样。
所以这是一个非常好的声明:
var num1 = new[] { 1, 2, 3, 4 };
看,这里没有int
,但如果你将鼠标悬停在var
它会告诉你数组是一个int[]
。
混合类型时越来越难:
var num1 = new [] { "1", 1 };
然后编译器不知道并强制您指定类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.