2013-04-12 60 views
4

下面的代码说明我无法与一个结构使用隐特性:无法编译一个struct

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

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

它无法编译,并显示错误消息

“后备字段,用于自动实现的属性 “blahblah.LimitfailureRecord.SampleCode” 必须控制返回给调用者之前被完全分配。 考虑从调用构造函数初始化 默认构造函数“。

如果我改变结构的一类它的罚款。 我需要做什么才能使这个工作成为一个结构?如果我可以避免的话,我宁愿不去支持长度的字段(这是真正的代码的严重缩减版本)。

+0

Dup的:[C#:结构构造:“字段必须完全分配...“(http://stackoverflow.com/questions/2534960/c-struct-constructor-fields-must-be-fully-assigned -before-控制是-returne) –

回答

5

对于结构必须调用所有其他构造函数的默认构造函数:

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

我明白了 - 。所以现在明显 – haughtonomous

2

使用构造链接,像这样:

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

原因是自动实现的属性引入了(产生的)实例字段为后盾,如所描述。所有实例字段必须分配给struct的实例构造函数

其实你引用错误的文字描述了修复得很好。

别的东西:如果你保持set访问你的财产public你将有一个可变的结构。多数人认为可变结构应避免与有“邪恶”的,因为他们的复制值语义和变异的现有结构值(如record.SampleCode = "Here's a new string for an old object";)的可能性不顺利起来。检查可变结构和不可变结构上的线程。

1

你要么需要调用默认的构造函数或更改的方法名。

所以;

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

      public string SampleCode { get; set; } 
     } 

将工作或只是把方法定义; LimitfailureRecord(string sampleCode) : this()

后来是更好,因为它只需要一个电话把事情的工作。如果你使用init路由,你可以做new LimiFfailureRecord,然后在init之后。 C#中的结构只需要你调用默认的构造函数,但类不是这种情况,这就是为什么它会在你将其更改为类时进行编译的原因。

+0

的'init'方法变异的结构不建议例如这样的东西'someList [IDX]的.init( “ASDF”) ;'''''''''''''''''''''''''''''''''''''''''''''''''''不会像我们可以想象的那样用可变的结构体工作 –