无法编译结构

时间:2013-04-12 15:47:20

标签: c#

以下代码表明我不能对结构使用隐式属性:

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

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

无法编译,错误消息

  

“自动实施属性的备用字段”   'blahblah.LimitfailureRecord.SampleCode'   在将控制权返回给调用者之前必须完全分配。   考虑从构造函数中调用默认构造函数   初始值设定“。

如果我将结构更改为类,那很好。 我需要做什么才能使它作为结构工作?如果我可以避免它,我宁愿不去支持字段的长度(这是真正代码的严重剥离版本)。

3 个答案:

答案 0 :(得分:5)

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

public LimitfailureRecord(string sampleCode) : this()
{
    SampleCode = sampleCode;
}

答案 1 :(得分:2)

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

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

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

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

其他内容:如果您保留属性set的{​​{1}}访问者,则会有一个可变结构。大多数人都同意应该避免使用可变结构并且是“邪恶的”,因为它们的按值复制语义和改变现有结构值的可能性(如在public中)并不能很好地结合在一起。检查可变和不可变结构上的线程。

答案 2 :(得分:1)

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

因此;

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

          public string SampleCode { get; set; }
      }

可以工作还是只做方法定义; LimitfailureRecord(string sampleCode) : this()

后者更好,因为它只需要一次调用即可使事情发挥作用。如果你去初始路线你做new LimiFfailureRecord,然后再打电话给init。 C#中的结构只需要你调用默认的构造函数,这不是类的情况,这就是为什么如果你把它改成类就会编译它。