4

以下代码表明我不能将隐式属性与结构一起使用:

public struct LimitfailureRecord
{
   public LimitfailureRecord(string sampleCode)
   {
      SampleCode = sampleCode;
   }

   public string SampleCode {get; set;}
   {
   }
}

编译失败,报错

“在将控制权返回给调用者之前,必须完全分配自动实现的属性 'blahblah.LimitfailureRecord.SampleCode' 的支持字段。考虑从构造函数初始化程序调用默认构造函数。”

如果我将结构更改为类,那很好。我需要做什么才能使这项工作成为一个结构?如果可以避免的话,我宁愿不考虑支持字段的长度(这是真实代码的大量精简版本)。

4

3 回答 3

5

对于结构,您必须在所有其他构造函数中调用默认构造函数:

public LimitfailureRecord(string sampleCode) : this()
{
    SampleCode = sampleCode;
}
于 2013-04-12T15:49:29.967 回答
2

像这样使用构造函数链接:

public LimitfailureRecord(string sampleCode)
    : this()
{
    ...
}

原因是自动实现的属性引入了一个(生成的)实例字段用于支持,如前所述。所有实例字段都必须在 的实例构造函数struct分配。

实际上,您引用的错误文本很好地描述了修复。

别的东西:如果你保留set你的属性的访问器,public你将拥有一个可变结构。大多数人都同意应该避免可变结构并且是“邪恶的”,因为它们的按值复制语义和改变现有结构值的可能性(如record.SampleCode = "Here's a new string for an old object";)不能很好地结合在一起。检查可变和不可变结构上的线程。

于 2013-04-12T15:49:12.527 回答
1

您需要调用默认构造函数或更改方法名称。

所以;

      public struct LimitfailureRecord
      {
          public void init(string sampleCode)
          {
              SampleCode = sampleCode;
          }

          public string SampleCode { get; set; }
      }

将起作用或仅进行方法定义;LimitfailureRecord(string sampleCode) : this()

后者更好,因为它只需要一个电话就可以使事情正常进行。如果你走你已经做的初始化路线new LimiFfailureRecord然后打电话init。C# 中的结构只要求您调用默认构造函数,类不是这种情况,这就是为什么如果您将其更改为类,它将编译的原因。

于 2013-04-12T15:51:40.127 回答