new 运算符 - 从交错数组初始化中省略 c# new

本文关键字:new 初始化 中省 数组 运算符 | 更新日期: 2023-09-27 17:55:26

发件人: http://msdn.microsoft.com/en-us/library/2s05feca.aspx

请注意,不能从元素初始化中省略 new 运算符,因为元素没有默认初始化:

int[][] jaggedArray3 = 
{
    new int[] {1,3,5,7,9},
    new int[] {0,2,4,6},
    new int[] {11,22}
};

什么意思?

为什么可以省略新的:

int[]    arrSimp = { 1, 2, 3 };
int[,]   arrMult = { { 1, 1 }, { 2, 2 }, { 3, 3 } };

但在以下情况下不可能:

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

new 运算符 - 从交错数组初始化中省略 c# new

首先,多么巧合,你的问题的一个方面是我今天博客的主题:

http://ericlippert.com/2013/01/24/five-dollar-words-for-programmers-elision/

你已在 C# 对表达式进行分类的方式中发现了一个小"疣"。事实证明,数组初始值设定项语法{1, 2, 3}不是表达式。相反,它是一个语法单元,只能用作另一个表达式的一部分:

new[] { 1, 2, 3 }
new int[] { 1, 2, 3 }
new int[3] { 1, 2, 3 }
new int[,] { { 1, 2, 3 } }
... and so on

或作为集合初始值设定项的一部分:

new List<int> { 1, 2, 3 }

或在变量声明中:

int[] x = { 1, 2, 3 };

在需要表达式的任何其他上下文中使用数组初始值设定项语法是不合法的。例如:

int[] x;
x = { 1, 2, 3 }; 

是不合法的。

这只是 C# 语言的一个奇怪的极端情况。你发现的不一致没有更深的含义。

从本质上讲,答案是"因为他们(意味着语言设计者)选择不这样做。引用Eric Lippert的话:

每个未实现

的功能未实现的原因相同: 默认情况下,功能未实现。为了实施 特征必须 (1) 考虑,(2) 设计,(3) 指定,(4) 已实施,(5) 经过测试,(6) 记录在案,(7) 已发货。

从技术上讲,它有一个很好的理由,那就是与一维和多维数组相比,交错数组的定义。

一个或多个维度数组可以用简单的英语表示为 T 的 X 维数组,其中交错数组必须表示为 T 数组的数组。在第二种情况下,内部数组和外部数组之间存在松散耦合。也就是说,您可以将新数组分配给外部数组中的某个位置,而 x 维数组是固定的。

既然我们知道交错数组在实现上与多维数组有很大不同,我们也可以假设为什么对 2 有不同级别的集成支持。增加支持当然不是不可能,只是需求和时间的问题。

(作为预告片,为什么只添加对交错数组的支持?你自己的自定义类型怎么样?