如何评估数组类型声明'new int [10] []'?

时间:2010-02-10 19:00:57

标签: c# .net clr

a)如何评估数组类型声明new int[10][]?是否进行了评估

(new int[10])[]

(new int[10][])

或......?

b)我不知道如何问这个:我知道语句int[][] i = (new int[10])[]会给我们编译错误。但假设编译器不会报告错误,编译器会根据此语句创建什么样的数组类型?


编辑:

我为无法使我的问题更全面而道歉。这是其中一个困扰我的问题之一,我无法在脑海中充分理解这个问题,以便对它有所了解。所以我问半个问题,希望回复能帮到我。无论如何,这是一个毫无意义的问题,但我仍然想解释一下我的实际意义:

是什么促使所有这一切是来自MSDN的文章,其中说

  

主表达式分为array-creation-expressions和primary-no-array-creation-expressions。以这种方式处理数组创建表达式,而不是将其与其他简单的表达式表单一起列出,使语法能够禁止可能令人困惑的代码,例如

     

对象o = new int [3] [1];

     

否则将被解释为

     

对象o =(new int [3])[1];

所以这让我想到围绕这个数组创建表达式的不同部分的括号可能会给编译器提供关于它应该创建的数组类型的不同指令。

或者换句话说,我认为在解释数组创建/初始化语法时,编译器可能遵循一些内置逻辑(从某些数学字段派生)。换句话说,编译器没有构建数组,因为它的开发人员给出了特定的指令,例如“当你看到单词 new 某种类型的名称两对方括号([] []),然后按照这些分步说明,详细告诉您要做什么“,而不是开发人员只是构建在一些与数学相关的逻辑中,并且该编译器能够自己导出一个数组,而开发人员无需逐步指示它。

BTW - 我确实了解锯齿状和矩形阵列以及它们如何初始化等等;)

4 个答案:

答案 0 :(得分:10)

这是我关于它如何工作以及设计考虑因素的文章。希望能回答你的问题。

http://blogs.msdn.com/ericlippert/archive/2009/08/17/arrays-of-arrays.aspx

尝试您的具体问题:

  

如何评估数组类型声明“new int [10] []”?

这不是类型声明。 “class C {}”是一个类型声明,因为它声明了一个新类型。你得到的是一个对象创建表达式。

通过创建包含十个元素的新数组来评估它。每个元素都是一个变量,可以包含对整数数组的引用。每个变量都初始化为null。

  

是评估为(new int [10])[]还是as(new int [10] [])

我不明白这个问题。前者不合法,后者只是括号中的表达。所以我想答案是它的评价与后者相同,因为两者是相同的,但我不禁想到我错过了问题的重点。

  

但假设编译器不会报告错误,编译器会根据此语句创建什么样的数组类型?

如果主教不限于在对角线上移动,那么女王的开局怎么会有不同的表现?

这个问题没有提供足够的信息来回答这个问题。你必须说出主教的新规则是什么,而不仅仅是取消了什么限制。主教的新规则是什么?一旦我们知道新规则,我们就可以分析游戏的变化情况。

您尚未提出 所说的内容,只是不会所说的内容。这还不足以确定这个提议表达式的语义。

答案 1 :(得分:4)

这是一个大小为10的数组,其成员类型为整数数组,也称为锯齿状数组。

请参阅MSDN上的C#教程的this section(特别是Jagged Array部分)。

答案 2 :(得分:2)

我想我可以帮助回答一下你的问题。至少,我想我明白你不理解的东西,并且可以暂时唠叨它。

当编译器看到

int[][] a = new int[10][];

它的作用是创建一个长度为十的一维数组。此数组中的每个元素都能够保存对int[]的引用。然后,它将这个长度为10的一维数组的引用分配给a。因此,如果你明白了什么

int[] a = new int[10];

你现在应该能够理解

int[][] a = new int[10][];

一样。前者预留了十个可以容纳int的连续位置。后者保留十个连续的插槽,可以保存对int[]的引用。 (我们省略了其他详细信息,例如Length属性等等。)所以,如果你想象一个幻想语法ArrayCreate(Type type, int length),前者是

int[] a = ArrayCreate(typeof(int), 10);

而后者是

int[][] a = ArrayCreate(typeof(int[]), 10);

现在,我真的不明白你在标有“a)”和“b)”的两个问题中所提出的问题。也许你可以用这种奇妙的ArrayCreate语法对它们进行改写,我可以尝试回答它们吗?

我希望有所帮助。

答案 3 :(得分:1)

它将为您提供宽度为10的整数值和不确定深度的向量。每个向量的深度将在10个索引中的每个被实例化和填充时确定。