c#中数组定义问题,求真相~~~(>_<)~~~

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
int[,] arr = new int[3,4]{ { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };//1正确
int[,] arr = new int[3,4];
arr = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };//2错误
/*请问以上arr数组定义为什么不正确,1定义的跟2定义的不是一回事吗?我把鼠标放在arr上提示的是(局部变量)int[,] arr 跟下面定义的数组应该也是一样的呀 */
int[,] arr = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
}
}
}

问题在于 { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
第一种的:
int[,] arr = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
是初始化数组的一种方式 是一种固定的语法
第二种分开赋值时的:
arr = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
实际是一个匿名类型的初始化器 最外面{}括号里每一个用逗号分割的成员可以认为是一个属性 给arr赋值的时候初始化器是需要配合new的,它会自动判断类型的 一般的类只需要new即可,一维数组可以用new[],多维可以用new[,]数组具体类型不用指定,编译器自动推断 由于你给arr赋值时没有new 所以就无法构成一个匿名类型 编译器就会报错
所以 你把arr=那儿改成:
arr = new [,]{ { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
即可追问

int[,] arr = new int[3,4]; 这句不是new了吗只是没有给这个数组赋值而已? 下一句再赋值为什么就不行呢?

追答

我已经说了啊 arr是初始化了 但是arr=后面的对象是一个初始化器 但因为没有new所以没有初始化 所以赋值是不正确的 这叫隐式类型 可用于数组中
详见msdn:
http://msdn.microsoft.com/zh-cn/library/bb384090.aspx
更多的关于为什么arr在初始化时不赋值 然后分开赋值时必须分配给一个new的对象的原因,见msdn:
http://msdn.microsoft.com/zh-cn/library/2yd9wwz4.aspx

追问

不好意思本人比较笨 int[,] arr = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }; 这种写法不也没有new吗但它是正确的呀⊙﹏⊙

追答

那是初始化多维数组不指定级别的一种方式 语法规定可以这样写的 在我上面的第二个msdn链接里已经写的很清楚了...你自己仔细看看

追问

哎呀 我笨死了 还是没理解 不问了 分给你啦 谢谢回答那么多

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-05
arr = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
这种写法不是 “赋值” !!! 你可能有些理解错误,这其实是调用了一种叫 “初始化器” 的东西。
叫都叫初始化器了,它当然只能在做初始化的时候用了,也就是这个变量被定义的那一行!
第2个回答  2012-03-06
楼主SB
第3个回答  2012-03-05
同上
相似回答