为什么`new int [x] {}`不会有效?

时间:2010-05-16 21:39:14

标签: c# arrays monodevelop opensuse

在MonoDevelop中,我有以下代码编译:

int[] row = new int[indices.Count]{};

然而,在运行时,我得到:

  

Matrix.cs(53,53):错误CS0150:A   预期值(CS0150)   (testMatrix)

我知道这个错误意味着什么并强迫我调整数组的大小:

int[] row = new int[indices.Count]{};
Array.Resize(ref row, rowWidth);

这是我必须处理的事情,因为我在Linux上使用MonoDevelop吗?我确信在.Net 3.5下我能够使用包含数组宽度的变量初始化数组。任何人都可以确认这是孤立的吗?如果是这样,我可以向bugzilla报告错误。

4 个答案:

答案 0 :(得分:13)

您不能将数组创建语法与对象初始化语法混合使用。删除{ }

当你写:

int[] row = new int[indices.Count];

您正在创建一个大小为indices.Count的新数组,该数组已初始化为默认值。

当你写:

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

您正在创建一个数组,然后将其内容初始化为值[1,2,3,4]。数组的大小是从元素的数量推断出来的。这是简写​​:

int[] row = new int[4];
row[0] = 1;
row[1] = 2;
row[2] = 3;
row[3] = 4;

数组仍然首先被初始化为默认值,这个语法只是提供了一个简写,以避免havind自己编写这些额外的赋值。

答案 1 :(得分:1)

以下代码在Windows / .NET / LINQPad上由于相同的原因无法编译:

void Main()
{
    int[] row = new int[indices.Count]{};
    row[2] = 10;
    row.Dump();
}

// Define other methods and classes here
public class indices {
    public static int Count = 5;
}

但是,从声明({})中删除对象初始化会使其正常工作。

答案 2 :(得分:1)

在C#中,如果要声明一个空数组,则语法应为:

  

int [] row = new int [indices.Count];

答案 3 :(得分:0)

因为当你使用数组初始化语法并指定数组的大小时

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

数组的大小是多余的信息。编译器可以从初始化列表中推断出大小。正如其他人所说,你要么创建空数组:

int[] arr = new int[5];

或使用初始化列表:

int[] arr = {1,2,3,4,5};