以下代码表明我不能对结构使用隐式属性:
public struct LimitfailureRecord
{
public LimitfailureRecord(string sampleCode)
{
SampleCode = sampleCode;
}
public string SampleCode {get; set;}
{
}
}
无法编译,错误消息
“自动实施属性的备用字段” 'blahblah.LimitfailureRecord.SampleCode' 在将控制权返回给调用者之前必须完全分配。 考虑从构造函数中调用默认构造函数 初始值设定“。
如果我将结构更改为类,那很好。 我需要做什么才能使它作为结构工作?如果我可以避免它,我宁愿不去支持字段的长度(这是真正代码的严重剥离版本)。
答案 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#中的结构只需要你调用默认的构造函数,这不是类的情况,这就是为什么如果你把它改成类就会编译它。