Stack overflow exception in C# setter

前端 未结 4 1241
星月不相逢
星月不相逢 2020-11-28 15:12

This works:

using System;
using ConstraintSet = System.Collections.Generic.Dictionary;

namespace ConsoleApplication2
{
    class         


        
4条回答
  •  甜味超标
    2020-11-28 15:49

    You haven't declared a backing variable - you've just got a property whose getters and setters call themselves. It's not clear to me why the first form isn't supported by Unity - which means it's possible that the equivalent won't be supported either, but it's basically this:

    private ConstraintSet aValue;
    public ConstraintSet a { get { return aValue; } set { aValue = value; } }
    

    I'd normally have a more conventional name, of course - which means you can get away without the "value` bit:

    private ConstraintSet constraints;
    public ConstraintSet Constraints
    {
        get { return constraints; } 
        set { constraints = value; }
    }
    

    To give a bit more detail as to why your current second form is throwing a StackOverflowException, you should always remember that properties are basically methods in disguise. Your broken code looks like this:

    public ConstraintSet get_a()
    {
        return get_a();
    }
    
    public void set_a(ConstraintSet value)
    {
        set_a(value);
    }
    

    Hopefully it's obvious why that version is blowing the stack. The amended version just sets a variable instead of calling the property again, so it looks like this when expanded:

    private ConstraintSet aValue;
    
    public ConstraintSet get_a()
    {
        return aValue;
    }
    
    public void set_a(ConstraintSet value)
    {
        aValue = value;
    }
    

提交回复
热议问题