首页 新闻 赞助 找找看

定义属性时,set 赋值给 属性自己,编译时为什么不报错呢?

0
悬赏园豆:15 [已关闭问题]

像下面 定义的属性,编译的时候不报错,但运行时,会陷于死循环中,问下,编译的时候 编译器为什么没有做检查呢?

private int m_propID=0;

 public int PropID
{
     get { return m_propID; }
     set { PropID= value; }
}

 

请大家帮忙?

问题补充: 反汇编后,发现 set 里面 像递归一样 定义了自己同时又调用了自己,但又没有跳出的条件。 错误的定义: .method public hidebysig specialname instance void set_PropID(int32 'value') cil managed { // 代码大小 10 (0xa) .maxstack 8 IL_0000: nop IL_0001: ldarg.0 IL_0002: ldarg.1 IL_0003: call instance void TestProperty.AutoProp::set_PropID(int32) IL_0008: nop IL_0009: ret } // end of method AutoProp::set_PropID 正确的定义: .method public hidebysig specialname instance void set_PropID(int32 'value') cil managed { // 代码大小 9 (0x9) .maxstack 8 IL_0000: nop IL_0001: ldarg.0 IL_0002: ldarg.1 IL_0003: stfld int32 TestProperty.AutoProp::m_propID IL_0008: ret } // end of method AutoProp::set_PropID 但还是不明白,编译器 为什么不会 检查这个错误?或是不在检查范围内?
一九零零的主页 一九零零 | 菜鸟二级 | 园豆:211
提问于:2010-07-29 17:11
< >
分享
其他回答(3)
0

PropID 是属性,是可访问的。何必这样纠结呢,写过来不就行了。

Astar | 园豆:40805 (高人七级) | 2010-07-29 17:19
呵呵,但是 就是不太明白 编译器 为什么不会报错,同时也没有做什么警告?
支持(0) 反对(0) 一九零零 | 园豆:211 (菜鸟二级) | 2010-07-29 17:41
@一九零零:VS做不到处处智能,以前也发现其实编译没问题运行出错的。
支持(0) 反对(0) Astar | 园豆:40805 (高人七级) | 2010-07-29 17:44
0

这个如果会报错的话,那么下面的方法是不是也得编译报错了……

public void Bug() {

  Bug();
}

Gray Zhang | 园豆:17610 (专家六级) | 2010-07-29 23:30
0

属性没有自己的存储空间,类似方法,是可以递归的,为什么要报错呢

SimonDM | 园豆:205 (菜鸟二级) | 2010-07-29 23:56
明白了,vs 应该是 当作正常来处理的,所以 不报什么错误!感谢大家!
支持(0) 反对(0) 一九零零 | 园豆:211 (菜鸟二级) | 2010-07-30 09:07
0

这个就好比是一个递归调用,因为没有终止条件、会陷入死循环,最后触发 StackOverflowException。

HUHU慈悲 | 园豆:9973 (大侠五级) | 2010-08-10 21:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册