为什么在结构的构造函数中设置属性不起作用?

时间:2011-03-01 11:40:29

标签: c# properties struct

我有以下不允许的代码(下面的错误),为什么?

    struct A
    {
        private int b;

        public A(int x)
        {
            B = x;
        }
        public int B
        {
            get { return b; }
            set { b=value; }
        }

    }

我收到以下错误:

  

在分配所有字段之前,不能使用'this'对象   在返回控件之前,必须完全分配字段'Test.x'   给来电者

3 个答案:

答案 0 :(得分:4)

在使用任何方法或属性之前,必须明确分配struct的变量。这里有两种可能的解决方法:

1)您可以显式调用无参数构造函数:

public A(int x) : this()
{
    B = x;
}

2)您可以使用该字段而不是属性:

public A(int x)
{
    b = x;
}

当然第二个选项仅适用于您当前的表单 - 如果您想更改结构以使用自动属性,则 使用来使用第一个选项。

然而,重要的是,你现在有一个可变的结构。这几乎总是一个非常糟糕的主意。我会强烈敦促你改用这样的东西:

struct A
{
    private readonly int b;

    public A(int x)
    {
        b = x;
    }

    public int B { get { return b; } }
}

编辑:原始代码不起作用的更多细节......

来自C#规范的第11.3.8节:

  

如果struct实例构造函数未指定构造函数初始值设定项,则this变量对应于struct类型的out参数

现在最初不会明确分配,这意味着你无法执行任何成员函数(包括属性设置器),直到构造的结构的所有第一个都被明确赋值。编译器不知道或尝试考虑属性setter不会尝试从另一个字段读取的事实。这一切都有助于避免从尚未明确分配的领域中进行阅读。

答案 1 :(得分:1)

将构造函数更改为:

public A(int x) :
    this()
{
    B = x;
}

关于“为什么”,请参阅11.3.8 Constructors5.3 Definite assignment

答案 2 :(得分:1)

MSDN“在结构声明中,除非将字段声明为const或static,否则无法初始化字段。”