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

本文关键字:什么 问题 定义 Struct 类型 这个 | 更新日期: 2023-09-27 18:11:03

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

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'必须完全分配在控制权返回给调用方之前。考虑调用默认值来自构造函数初始化项的构造函数。"

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

其实有两个问题:

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; }
}

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

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; 
    } 
} 

我认为这与结构初始化有关。请注意,对我添加的默认构造函数的调用似乎使它满意:)

"似乎使它快乐"——这是多么愚蠢啊。我四处寻找真正的答案,这与结构体如何初始化有关。调用默认构造函数可确保在使用结构体之前初始化字段。

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

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

您正在尝试创建一个自动实现的属性,但是您正在定义"支持字段"(没有明显的用途),然后您在构造函数中为这些支持字段赋值,并使您的属性完全不受影响。

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

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

看这里