C#语言相比其他支持CLR的语言来说,对于值类型的构造有个特殊的地方,即不允许值类型有无参数的构造函数
所以当一个值类型没有提供任何构造函数的时候,是不能够对字段在定义中进行初始化,如下:
public struct Point
{
public int x = 0; //编译报错
public int y = 0; //编译报错
}
因为对于成员变量申明的同时进行初始化,编译器会在构造函数中将初始化的代码加入,如果没有构造函数,编译器会默认生成一个无参数的构造函数,这个就与值类型不支持无参数构造函数相冲突了。
至于为什么值类型不允许有无参构造函数,应该还是微软防止程序员不去显式调用构造函数,对于值类型的变量来说,如果不去显式调用构造函数的话,编译器不会在生成的IL代码中添加调用构造函数的代码的。
关于值类型构造函数的使用说明,在C# via CLR上有比较详细的说明。