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

C# 为什么在结构的构造函数中设置属性不起作用?,c#,properties,struct,C#,Properties,Struct,我有以下代码是不允许的(错误如下),为什么 我收到以下错误: 在分配“this”对象的所有字段之前,不能使用该对象 在返回控件之前,必须完全分配到字段“Test.x” 打电话的人 将构造函数更改为: public A(int x) : this() { B = x; } 至于“为什么”,请参阅和。在使用任何方法或属性之前,必须明确指定结构的所有变量。这里有两种可能的修复方法: 1) 可以显式调用无参数构造函数: public A(int x) : this() { B

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

我收到以下错误:

在分配“this”对象的所有字段之前,不能使用该对象 在返回控件之前,必须完全分配到字段“Test.x” 打电话的人


将构造函数更改为:

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

至于“为什么”,请参阅和。

在使用任何方法或属性之前,必须明确指定结构的所有变量。这里有两种可能的修复方法:

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节:

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


现在,最初不会明确指定,这意味着您不能执行任何成员函数(包括属性设置器),直到所构造的结构的所有第一个都明确指定。编译器不知道或试图考虑属性设置程序不尝试从另一个字段读取的事实。这一切都有助于避免读取尚未明确指定的字段。

我不明白。设置为具有相同功能(b=值)的属性与手动操作之间有什么区别?我仍然不明白为什么B=x不起作用。顺便说一句,结构变量是字段,或者我应该将它们称为变量?@Cocodrilo-因为在结构完全初始化之前,您无法对其执行任何操作,这可以通过调用默认(以及,可能是假的)构造函数来实现,也可以通过显式分配所有字段来实现。在完成之前,您无法访问属性(即方法)。上面的“1”显示第一个选项(构造函数),上面的“2”显示“分配所有字段”选项。@Cocodrilo和第二个Jon点;易变结构是非常非常糟糕的魔法。@Cocodrilo:看我的编辑-老实说,阅读C#规范非常有用。我现在迷路了。可变结构有什么坏处?我想我可以像处理类一样处理它(除了作为值类型)@Gunner:如果没有,此代码将删除此错误您将有一个错误,因为“This”对象在其所有字段分配之前无法使用检查我的答案您将清楚地了解它
struct A
{
    private readonly int b;

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

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