为什么结构体的成员不能在声明的时候赋初值?

g1343jksd 2014-03-04 08:52:32
我这样声明一个结构体会编译不过去:

struct C
{
public int i = 0;
}

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

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

求教。
...全文
1343 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Regan-lin 2014-03-04
  • 打赏
  • 举报
回复
http://blog.csdn.net/yixiantian7/article/details/11634789
BenBenBears 2014-03-04
  • 打赏
  • 举报
回复
有几种变量在创建时自动初始化为它们的默认值。对于类类型和其他引用类型的变量,此默认值为 null。但是,由于结构是不能为 null 的值类型,结构的默认值是通过将所有值类型字段设置为它们的默认值,并将所有引用类型字段设置为 null 而产生的值。如上所述,结构的默认值就是将所有值类型字段设置为它们的默认值并将所有引用类型字段设置为 null 而产生的值。由于这个原因,结构不允许它的实例字段声明中含有变量初始值设定项。此限制只适用于实例字段。在结构的静态字段声明中可以含有变量初始值设定项。 示例 struct Point { public int x = 1; // Error, initializer not permitted public int y = 1; // Error, initializer not permitted } 出现错误,因为实例字段声明中含有变量初始值设定项。 简单的说这样是为了避免码农将值类型的变量初始化为null。
g1343jksd 2014-03-04
  • 打赏
  • 举报
回复
引用 1 楼 BenBenBears 的回复:
有几种变量在创建时自动初始化为它们的默认值。对于类类型和其他引用类型的变量,此默认值为 null。但是,由于结构是不能为 null 的值类型,结构的默认值是通过将所有值类型字段设置为它们的默认值,并将所有引用类型字段设置为 null 而产生的值。如上所述,结构的默认值就是将所有值类型字段设置为它们的默认值并将所有引用类型字段设置为 null 而产生的值。由于这个原因,结构不允许它的实例字段声明中含有变量初始值设定项。此限制只适用于实例字段。在结构的静态字段声明中可以含有变量初始值设定项。 示例 struct Point { public int x = 1; // Error, initializer not permitted public int y = 1; // Error, initializer not permitted } 出现错误,因为实例字段声明中含有变量初始值设定项。 简单的说这样是为了避免码农将值类型的变量初始化为null。
没有看懂你说的"由于这个原因,结构不允许它的实例字段声明中含有变量初始值设定项。"----这个原因和结果之间我没看出来有什么逻辑上的推理或者联系啊。 由于这个原因,怎么就不允许了呢? 就像你举的例子,如果我 Point p; 这样声明一个结构体的实例,那么x和y的值都是默认的1,都什么不妥吗? 请继续执教!

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧