当试图将公共值分配给私有支持字段时,StackOverflowException
本文关键字:支持 字段 StackOverflowException 分配 | 更新日期: 2023-09-27 17:50:02
我有一个像下面这样的私有支持的公共属性。在行selected = Selected;
上,我得到一个SO异常。看起来赋值会导致无限递归。有人能更详细地解释一下发生了什么吗?代码应该是什么呢?
//other class stuff AssetTypes is an enum btw.
private AssetTypes? selected = null;
public AssetTypes? Selected
{
get
{
return selected;
}
set
{
selected = Selected;
if (selected == AssetTypes.Image)
{
image.Click();
}
else if (selected == AssetTypes.Video)
{
video.Click();
}
else
{
selected = null;
}
}
}
唯一可以修改的部分是setter中的赋值。if-else逻辑需要保持不变
setter有一个名为value
的参数,该参数是要设置属性的值。你应该从那里得到新的值,而不是从Selected
,它只是调用getter,返回之前的值。
因此,这一行什么也不做:
selected = Selected;
你永远不应该在Selected
自己的setter中给它赋值,因为它调用了同一个setter,因此你的无限递归。
试试这个:
set
{
if (value == AssetTypes.Image)
{
image.Click();
selected = value;
}
else if (value == AssetTypes.Video)
{
video.Click();
selected = value;
}
else
{
selected = null;
}
}
我认为问题在else: Selected = null
使用小写s的selected = null
。
问候!
你在Selected = null
上有一个无限递归,这就是为什么你得到一个stackoverflow异常。它一遍又一遍地调用Selected
set,直到最终产生一个异常。修改
selected = null;
selected = selected不做任何操作
传递给Set的是value;
public AssetTypes? Selected
{
get
{
return selected;
}
set
{
if (selected == value) return; // use this to not do it again
selected = value;
if (selected == AssetTypes.Image)
{
image.Click();
}
else if (selected == AssetTypes.Video)
{
video.Click();
}
else
{
selected = null; // Selected = null; was the recursion
}
NotifyPropertyChanged("Selected"); // this optional and only if you implement INPC
}
}