日期:2014-05-16  浏览次数:21519 次

为什么结构体的成员不能在声明的时候赋初值?
我这样声明一个结构体会编译不过去:

    struct C
    {
        public int i = 0;
    }

提示: cannot have instance field initializers in structs
但是如果我把struct改成class就好了。

为什么C#的语法有这样的限制呢?我知道struct意味着值类型,class意味着引用类型,为什么值类型里面的成员不支持声明时赋值。如果可以这样做的话,C#的语法会引起什么歧义或者判定上的问题吗?

求教。
------解决方案--------------------
有几种变量在创建时自动初始化为它们的默认值。对于类类型和其他引用类型的变量,此默认值为 null。但是,由于结构是不能为 null 的值类型,结构的默认值是通过将所有值类型字段设置为它们的默认值,并将所有引用类型字段设置为 null 而产生的值。如上所述,结构的默认值就是将所有值类型字段设置为它们的默认值并将所有引用类型字段设置为 null 而产生的值。由于这个原因,结构不允许它的实例字段声明中含有变量初始值设定项。此限制只适用于实例字段。在结构的静态字段声明中可以含有变量初始值设定项。
示例
struct Point
{
   public int x = 1;  // Error, initializer not permitted
   public int y = 1;  // Error, initializer not permitted
}
出现错误,因为实例字段声明中含有变量初始值设定项。

简单的说这样是为了避免码农将值类型的变量初始化为null。