值类型变量问题
struct SomeValue { public Int32 x; }
//SomeVal v1 = new SomeVal(); //分配在堆栈上
SomeVal v1; //分配在堆栈上(与上面语句对比)
该行代码也会产生将实例分配在线程堆栈上,并将其所有字段置0的IL指令。两者唯一的差别是如果我么使用了new操作符,那么C#将认为实例已经得到了初始化。
又,
SomeVal v1;
Int32 a = v1.x;//无法通过编译:使用了可能未赋值的字段"x"
---------------------------------------------------------------------
上面这些是我从《.net框架程序设计》137-138页截取下来的(个人省略了一些东西,但基本意思霉变)。
我有一点很不理解:既然“SomeVal v1;”也会产生将实例分配在线程堆栈上,并将其所有字段置0的IL指令,那C#为什么还会认为这种情况下v1没有初始化呢?“将实例分配在线程堆栈上,并将其所有字段置0的IL指令”不正是C#编译器产生的么?既然它自己(C#编译器)产生了这些“清0”指令,那么它就应该认为v1是已经初始化的,进而使“Int32 a = v1.x;”能够顺利编译!但是现实却是:它自己(C#编译器)产生了这些“清0”指令,却又说v1没有赋值,而不让“Int32 a = v1.x;”通过编译!!这不是自相矛盾么?
望高手给解释一下,谢谢。