编译错误.在struct中使用属性

Cap*_*mic 12 c# language-features struct compiler-errors

请解释struct构造函数的以下错误.如果我将struct更改为class,那么错误就会消失.

public struct DealImportRequest
{
    public DealRequestBase DealReq { get; set; }
    public int ImportRetryCounter { get; set; }

    public DealImportRequest(DealRequestBase drb)
    {
        DealReq = drb;
        ImportRetryCounter = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 错误CS0188:在分配所有字段之前,不能使用'this'对象
  • 错误CS0843:在将控制权返回给调用者之前,必须完全分配自动实现的属性"DealImportRequest.DealReq"的备份字段.考虑从构造函数初始化程序中调用默认构造函数.

Ani*_*Ani 14

正如错误消息建议的那样,您可以通过从构造函数初始值设定项中调用默认构造函数来解决此问题.

public DealImportRequest(DealRequestBase drb) : this()
{
   DealReq = drb;
   ImportRetryCounter = 0;
}
Run Code Online (Sandbox Code Playgroud)

从语言规范:

10.7.3自动实现的属性

将属性指定为自动实现的属性时,将为该属性自动提供隐藏的后备字段,并且实现访问器以读取和写入该后备字段.[...]由于支持字段不可访问,因此只能通过属性访问器读取和写入,即使在包含类型中也是如此.[...] 此限制还意味着只能使用结构的标准构造函数来实现具有自动实现属性的结构类型的明确赋值,因为分配给属性本身需要明确赋值结构.这意味着用户定义的构造函数必须调用默认构造函数.

当然,另一个(更详细的)替代方法是手动实现属性并在构造函数中自己设置支持字段.

请注意,您在那里的结构是可变的.不建议这样做.我建议您将类型设为类(您的编译问题应立即消失)或使类型不可变.最简单的方法是实现这一点,假设您提供的代码是整个结构,将使setter成为private(get; private set;).当然,您还应该确保在之后依赖私有访问来修改字段的结构中不添加任何变异方法.或者,您可以使用readonly支持字段支持属性并完全删除setter.