![](/img/trans.png)
[英]Why can't I declare an implicitly typed array without an initializer?
[英]Implicitly typed arrays: why we can't set array size explicitly?
C#语言规范(7.6.10.4)说,有树种类的数组创建表达式:
new non-array-type [expression-list] rank-specifiersopt array-initializeropt
新的array-type array-initializer
新的rank-specifier array-initializer
第三个用于隐式类型化数组:
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个示例不同,这不是首先创建特定对象并填充它的情况。 这是一种用于创建隐式类型数组的特殊语法,其中数组及其内容是从大括号的内容推断出来的,然后创建。
我不知道为什么不应该存在这种语法,但我认为这对于你所看到的不对称是一个合理的解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.