我遇到了语法问题:以下行正常:
char[,] board = new char[2, 2] { { '1', '2' }, { '3', '4' } };
但如果我有一个字符串数组并试试这个:
char[,] board = new char[2, 2] { "12".ToCharArray(), "34".ToCharArray() };
它给了我错误:CS0846预期嵌套数组初始值设定项。 什么应该是正确的语法,因为我有很长的字符串,并且不使用第一个示例中的char语法?
答案 0 :(得分:1)
C#语言具有识别多维数组的特殊语法。虽然语法看起来非常类似于锯齿状数组的初始化(例如char[][]
),但您无法使用该语法从其他对象执行初始化。
在您的示例中,如果您正在初始化锯齿状数组(或者更确切地说,类似于它:char[][] board2 = new char[][] { "12".ToCharArray(), "34".ToCharArray() };
),那么带有字符串文字的语法将起作用,但是对于变量声明中的多维数组的初始化,你必须使用嵌套数组初始值设定项,因为你不像在锯齿状数组中那样初始化单维数组中的单个对象。
编译器需要能够在编译时为单个对象生成所有初始化,并且当您尝试使用在运行时获取的数组初始化二维数组时,它无法执行此操作。 ToCharArray()
方法)。
所以,你必须以艰难的方式去做。例如:
string[] rows = { "12", "34" };
for (int i = 0; i < rows.Length; i++)
for (int j = 0; j < rows[i].Length; j++)
{
board[i, j] = rows[i][j];
}
如果您希望必须经常编写类似的代码,则可以将该逻辑封装在方法中。例如:
private static void InitBoard(char[,] board, params string[] rows)
{
for (int i = 0; i < rows.Length; i++)
for (int j = 0; j < rows[i].Length; j++)
{
board[i, j] = rows[i][j];
}
}
这样称呼:
char[,] board = new char[2,2];
InitBoard(board, "12", "34");