无法分配struct中自动实现的属性

Vas*_*sya 24 .net c# constructor automatic-properties

我有下一个代码:

struct T 
{
    public T(int u) 
    { 
        this.U = 10; //Errors are here
    }

    public int U { get; private set;  }
}
Run Code Online (Sandbox Code Playgroud)

C#编译器在规定的行中给出了一对错误:1)在将控制权返回给调用者之前,必须完全分配自动实现的属性"TestConsoleApp.Program.TU"的后备字段.考虑从构造函数初始化程序中调用默认构造函数.2)在分配所有字段之前,不能使用'this'对象

我做错了什么?帮帮我理解

Eni*_*ity 73

来自C#规范:

10.7.3自动实现的属性

将属性指定为自动实现的属性时,将为该属性自动提供隐藏的后备字段,并且实现访问器以读取和写入该后备字段.

[删除]

由于支持字段不可访问,因此只能通过属性访问器读取和写入,即使在包含类型中也是如此.

[删除]

此限制还意味着只能使用结构的标准构造函数来实现具有自动实现属性的结构类型的明确赋值,因为分配给属性本身需要明确赋值结构.这意味着用户定义的构造函数必须调用默认构造函数.

所以你需要这个:

struct T 
{
    public T(int u)
        : this()
    { 
        this.U = u;
    }

    public int U { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 19

好吧,首先你要创建一个可变结构 - 这几乎总是一个非常糟糕的主意.可变结构有时可以以您不期望的方式运行.好吧,它只是私下可变的,但是你编写代码来改变它的事实是一个不好的迹象.

第二个错误的原因是,在分配了所有字段之前,您不能使用结构的任何属性或方法,因此您需要链接到隐式无参数构造函数:

public T(int u) : this()
{ 
    this.U = 10;
}
Run Code Online (Sandbox Code Playgroud)

编译器要求任何构造函数都保留所有明确赋值的字段(这就是为什么你之前得到的第一个错误;编译器不"知道"属性为字段赋值()) - 通过链接到this(),你正在制作确保当你到达构造函数体时,所有字段都已经明确分配,你不必再担心它了.

但是,除非你真的想允许变异,否则我建议你把它变成一个真正的只读属性:

struct T 
{
    private readonly int u;

    public T(int u)
    { 
        this.u = 10;
    }

    public int U { get { return u; } }
}
Run Code Online (Sandbox Code Playgroud)

现在更明显的是,即使在结构本身内也不想改变它.