结构构造函数:“在将控制权返回给调用者之前,必须完全分配字段。”

时间:2010-03-28 23:13:28

标签: c# constructor struct

这是我想写的结构:

  public struct AttackTraits
        {
            public AttackTraits(double probability, int damage, float distance)
            {
                Probability = probability;
                Distance = distance;
                Damage = damage;
            }

            private double probability;
            public double Probability
            {
                get
                {
                    return probability;
                }
                set
                {
                    if (value > 1 || value < 0)
                    {
                        throw new ArgumentOutOfRangeException("Probability values must be in the range [0, 1]");
                    }
                    probability = value;
                }
            }

            public int Damage { get; set; }

            public float Distance { get; set; }
        }

这会导致以下编译错误:

  

无法使用'this'对象   在分配所有字段之前   到

     

字段'AttackTraits.probability'必须   在控制之前完全分配   返回给来电者

     

自动备份字段   实施财产   'AttackTraits.Damage'必须完全   在控制返回之前分配   呼叫者,召集者。考虑打电话给   构造函数的默认构造函数   初始化程序。

     

自动备份字段   实施财产   'AttackTraits.Distance'必须完全   在控制返回之前分配   呼叫者,召集者。考虑打电话给   构造函数的默认构造函数   初始化程序。

我做错了什么?

5 个答案:

答案 0 :(得分:288)

如果在具有自动属性的结构上看到此错误,只需通过执行下面的: this()示例从参数化参数中调用无参数构造函数:

struct MyStruct
{
  public int SomeProp { get; set; }

  public MyStruct(int someVal) : this()
  {
     this.SomeProp = someVal;
  }
}

通过从构造函数声明中调用this this(),让基类ValueType类初始化自动属性的所有支持字段。我们无法在构造函数上手动执行此操作,因为我们无法访问自动属性的支持字段。 ValueType是所有结构的基类。

答案 1 :(得分:48)

尝试访问概率字段而不是访问者。在这种情况下,自动道具应该也可以。

结构体无法使用无参数构造函数,因此请考虑将其更改为类。

最佳做法是仅在结构为16个字节或更少且不可变时使用结构。因此,如果您要在创建后更改对象字段,请考虑将其重构为类。

此外,您可以将构造函数定义更改为:

construct(params) : this()

这也将删除错误

答案 2 :(得分:30)

您正在通过probability属性设置Probability字段,但编译器不知道该属性设置字段...因此您需要显式初始化概率字段本身< / p>

public AttackTraits(double probability, int damage, float distance)
{
    this.probability = 0;
    Distance = distance;
    Damage = damage;
}

答案 3 :(得分:2)

将第Probability = probability行更改为this.probability = probability

将来会为参数选择不同的字段命名约定。例如,使用下划线为所有字段添加前缀,因此您只需调用它:

_probability = probability;

轻松看看发生了什么。

答案 4 :(得分:0)

尝试将攻击特质

结构更改为
public class AttackTraits
        {
.........
        {