Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StackOverflowException尝试将公共值分配给私有备份字段时_C#_.net - Fatal编程技术网

C# StackOverflowException尝试将公共值分配给私有备份字段时

C# StackOverflowException尝试将公共值分配给私有备份字段时,c#,.net,C#,.net,我有一个像下面这样有私人支持者的公共财产。在selected=selected行上我得到一个如此异常。赋值似乎导致了某种无限递归。有人能对正在发生的事情作更详细的解释吗?代码应该是什么 //other class stuff AssetTypes is an enum btw. private AssetTypes? selected = null; public AssetTypes? Selected { get {

我有一个像下面这样有私人支持者的公共财产。在
selected=selected行上我得到一个如此异常。赋值似乎导致了某种无限递归。有人能对正在发生的事情作更详细的解释吗?代码应该是什么

    //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逻辑需要保持不变。

Selected=null
上有一个无限递归,这就是为什么会出现stackoverflow异常。它一次又一次调用
Selected
set,直到最后出现异常。换成

selected = null;

我认为问题出在else:
Selected=null

selected=null
与小写字母s一起使用


你好

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
    }
}

setter有一个名为
value
的参数,该参数是属性要设置的值。您应该从中获取新值,而不是从所选的
中获取新值,它只调用getter,getter返回以前的值

因此,该行不起任何作用:

selected = Selected;
您永远不应该从它自己的setter中分配给
Selected
,因为它调用同一个setter,因此您的递归是无限的

请尝试以下方法:

set
{        
    if (value == AssetTypes.Image)
    {
        image.Click();
        selected = value;
    }
    else if (value == AssetTypes.Video)
    {
        video.Click();
        selected = value;
    }
    else
    {
        selected = null;
    }
}


selected=null
selected
属性。您正在分配selected=selected。应选择它=值。然后将选定(未选定)设置为空。您如何知道哪1/2是错误的?您接受的答案在接受时是错误的。否您的应用程序没有在selected=selected;上崩溃;。把它作为唯一的线路测试。然后重试Selected=null;作为唯一的一行。你真的因为无法更改逻辑而将else{Selected=null;}留在了应用程序中吗?然后证明它。放置选定项=选定项;回到第一行,应该会失败。他没有循环。他有无限的递归性。这不是循环。@Servy:伙计,我真不敢相信你会因此而否决我。我把它看作一个循环,但我认为这一点很清楚,把它称为递归循环并没有那么重要。用不恰当的术语(特别是与正确的术语完全相反的术语)来描述这个问题无疑是非常重要的。@Servy:我说它是一个循环,因为它在一个over上不停地执行相同的逻辑。这对我来说是一个循环。我认为这是次投票,不足以否决,但无论如何还是要感谢你。虽然我在某些情况下同意你的观点,但这种情况恰恰是区别的关键所在。无限循环不会溢出堆栈,但递归会溢出堆栈。不,那不是递归。它只是不改变值。递归是当他分配给
Selected
@Blorgbeard OK时,它被破坏了,我发布了一个有效的修复程序。你的修复程序会工作,但你的答案仍然包含错误的语句,顶部的
if
不是防止递归的必要条件,但会改变OP的逻辑。现在,设置相同的值两次不会单击图像两次。@Blorgbeard我的答案执行正确的单击。评论州用这个来表示不再这样做。顺便说一句,我已经把我的反对票转为赞成票。剩下的否决票不是我的。你否决了我对递归的错误陈述。我的回答是正确的行动。有图像。点击()和视频。点击()很好!固定的我对你的答案投了否决票,因为它包含一个关于递归所在位置的错误语句(“
selected=selected
is recursion”)。如果你修好了,我就投你一票!修正了,我从未投你反对票。我必须测试自己,以验证这不是递归。仍然是错误的和被接受的答案。selected==AssetTypes.Image将比较当前选择的值(不是传递给集合的值),我没有投票否决您或OP。