这个Struct类型的定义有什么问题

时间:2011-10-11 19:35:21

标签: c# struct

我已经定义了这样的结构:

struct Test
{
    private string assayName;
    public string AssayName { get; set; }

    private string oldUnitName;
    public string OldUnitName { get; set; }

    private string newUnitName;
    public string NewUnitName { get; set; }

    public Test(string name, string oldValue, string newValue)
    {
        assayName = name;
        oldUnitName = oldValue;
        newUnitName = newValue;
    }

}

但是它给了我以下错误:

  

“错误13自动实现属性的备用字段   必须完全分配“EnterResults.frmApplication.Test.NewUnitName”   在控制权返回给调用者之前。考虑调用默认值   构造函数初始化程序中的构造函数。“

5 个答案:

答案 0 :(得分:6)

您实际上并没有对这些属性做任何事情。试试这个:

struct Test 
{ 
    public string AssayName { get; set; } 
    public string OldUnitName { get; set; } 
    public string NewUnitName { get; set; } 

    public Test(string name, string oldValue, string newValue) : this()
    { 
        AssayName = name; 
        OldUnitName = oldValue; 
        NewUnitName = newValue; 
    } 
} 

我认为这与struct初始化有关。请注意,我添加的默认构造函数的调用似乎让它很开心:)

“似乎让它快乐” - 这是多么愚蠢。我四处寻找与结构初始化有关的真正答案。调用默认构造函数insures字段在使用结构之前初始化。

答案 1 :(得分:6)

嗯,确实有两个问题:

1.您使用自动属性,但随后也提供字段,两者之间没有连线。

2.当您使用自动属性时,因为这是一个结构,所以必须先对它们进行初始化。您可以通过调用默认构造函数来完成此操作。所以修改后的版本将是:

struct Test
{
    public Test(string name, string oldValue, string newValue)
        : this()
    {
        AssayName = name;
        OldUnitName = oldValue;
        NewUnitName = newValue;
    }

    public string AssayName { get; private set; }
    public string OldUnitValue { get; private set; }
    public string NewUnitValue { get; private set; }
}

答案 2 :(得分:3)

您可以删除private字段assayNameoldUnitNamenewUnitName。然后,您可以在构造函数中引用自动实现的属性:

public Test(string name, string oldValue, string newValue)
{
    AssayName = name;
    OldUnitName = oldValue;
    NewUnitName = newValue;
}

答案 3 :(得分:2)

您正在尝试创建Automatically Implemented Property,但是您正在定义“Backing fields”(没有明显用途),然后您将值分配给构造函数中的那些支持字段并保留您的属性完全没有动过。

答案 4 :(得分:2)

您也可以调用默认构造函数:

public Test(string name, string oldValue, string newValue) : this() 
{
   assayName = name;
   oldUnitName = oldValue;
   newUnitName = newValue;
}

请参阅here