这很容易解释: 这工作
using System;
using ConstraintSet = System.Collections.Generic.Dictionary<System.String, double>;
namespace ConsoleApplication2
{
class test
{
public ConstraintSet a { get; set; }
public test()
{
a = new ConstraintSet();
}
static void Main(string[] args)
{
test abc = new test();
Console.WriteLine("done");
}
}
}
这不是
using System;
using ConstraintSet = System.Collections.Generic.Dictionary<System.String, double>;
namespace ConsoleApplication2
{
class test
{
public ConstraintSet a { get { return a; } set { a = value; } }
public test()
{
a = new ConstraintSet();
}
static void Main(string[] args)
{
test abc = new test();
Console.WriteLine("done");
}
}
}
我在第二类的setter上得到了堆栈溢出异常,我不知道为什么。我不能使用第一种形式,因为统一引擎
不支持它答案 0 :(得分:34)
当您编写a = value
时,您再次调用属性设置器。
要使用非自动属性,您需要创建一个单独的私有支持字段,如下所示:
ConstraintSet a;
public ConstraintSet A { get { return a; } set { a = value; } }
答案 1 :(得分:16)
您尚未声明支持变量 - 您刚刚获得了一个属性,其getter和setter会自行调用。我不清楚为什么 Unity不支持第一种形式 - 这意味着它可能也不会支持等价物,但基本上就是这样:
private ConstraintSet aValue;
public ConstraintSet a { get { return aValue; } set { aValue = value; } }
我当然通常会有一个更传统的名字 - 这意味着你可以在没有“价值”的情况下离开:
private ConstraintSet constraints;
public ConstraintSet Constraints
{
get { return constraints; }
set { constraints = value; }
}
为了更详细地介绍当前第二种形式为什么抛出StackOverflowException
,你应该永远记住属性基本上是伪装的方法。破碎的代码如下所示:
public ConstraintSet get_a()
{
return get_a();
}
public void set_a(ConstraintSet value)
{
set_a(value);
}
希望很明显为什么该版本正在吹嘘堆栈。修改后的版本只是设置一个变量,而不是再次调用该属性,所以在展开时它看起来像这样:
private ConstraintSet aValue;
public ConstraintSet get_a()
{
return aValue;
}
public void set_a(ConstraintSet value)
{
aValue = value;
}
答案 2 :(得分:4)
您不能在getter和setter中使用相同的变量名
这将导致它自己调用并最终堆栈溢出。递归过多。
你需要一个支持变量:
private ConstraintSet _a;
public ConstraintSet a { get { return _a; } set { _a = value; } }
答案 3 :(得分:3)
您的公共财产需要私有支持变量:
private ConstraintSet _a;
public ConstraintSet a { get { return _a; } set { _a = value; } }