原因是这样的,编译器会定义一个把所有的数据成员初始化成0(假、null)等的构造函数,这个默认构造函数确保了结构体在生成时被初始化。
而如果允许你自己定义默认构造函数,那么就存在着一种可能:你漏掉了某个成员没有初始化。这样一来会导致这个成员的值在被构造后处于未知的状态,这是C#所不允许的。

解决方案 »

  1.   

    因为值类型的默认构造函数是clr自动完成的(0或null)
    如果允许值类型自定义默认构造函数的话,就可能影响clr的执行效率
    另外:
    这个是不可能的,任何值类型的构造函数都要求初始化所有字段,否则编译不通过。
      

  2.   

    CLR没有强制要求值类型必须定义构造器方法,但是CLR允许为值类型定义无参数构造器,很多编译器(包括C#)都不会为值类型产生默认的无参数构造器,这只是一种规定而已,是为了消除开发人员对于何时调用无惨构造器产生的混淆。
    这个解释够了吗?
      

  3.   

    CLR并不要求值类型必须定义构造器方法,实际上C#编译器也不会为值类型产生默认的无参构造器。但CLR允许我们为值类型定义构造器。当我们使用构造器,只有我们显式调用构造器才会被执行,用new来创建一个值类型时,只是调用的他的构造器(而引用类型却有3个步骤)。如果不使用new来创建,那么值类型的字段都会保持为0,因为在调用构造器之前系统为该对象分配的内存总是被设置为0。需要注意的时,不能给值类型定义一个无参构造器。严格的说只有内嵌于引用类型的值类型字段,CLR才会保证字段被初始化为0或null,基于堆栈的值类型字段无法保证。但因为CLR的代码可验证机制,要求所有基于堆栈的值类型字段在使用前都必须被赋值,而编译器可以保证这一点,这就保证了运行时不会出现异常。