在C#中创建自定义结构和访问属性词典

本文关键字:访问 属性 结构 创建 自定义 | 更新日期: 2023-09-27 18:21:40

我创建了一个定义如下的结构:

    public struct Piece
{
    string pieceType;
    string pCode;
    bool dead;
    bool highlighted;
    bool specialUsed;
    bool moved;
    Material defaultMaterial;
}

和在一个单独的子程序中创建了一个字典,它将保存这种类型的条目:

Dictionary<string, Piece> pieceDict;

我正试图使用foreach循环来填充它,如下所示:

            GameObject[] pieces = GameObject.FindGameObjectsWithTag("Piece");
        foreach (GameObject piece in pieces)
            {
            string pCode = GetPieceCode(piece);
            pieceDict.Add(pCode, new Piece());
            pieceDict[pCode].pCode = pCode;
            //More properties once I get this working will go here.
            }

然而,似乎出了问题,因为它不允许我访问新条目的各个属性。获取此错误:

 Cannot modify the return value of 'Dictionary<string, Piece>.this[string]' because it is not a variable

我看了文件,不知道哪里出了问题,所以如果有任何帮助,我们将不胜感激!

我正在使用UnityEngine。

在C#中创建自定义结构和访问属性词典

结构是值类型,当您传递结构时,它会创建结构的副本。这尤其是可变结构的问题,因为当您将结构传递给方法(或从属性中获取)时,结构会按值复制,然后您修改的是副本,而不是原始副本。

解决方法是避免使用可变结构,而是使用类。在构造过程中,仅在(其所有字段的)值固定的情况下使用structs。

编辑

为了对此进行一点扩展,我们可以检查以下行:

pieceDict[pCode].pCode = pCode;

这里发生的情况是,第一部分pieceDict[pCode]返回值的副本(在值类型的情况下),然后由.pCode部分操作,您将其分配给pCode,但因为您正在处理副本,而不是存储在字典中的内容,所以它将不会保存。编译器足够聪明,可以注意到您正在尝试分配给它,而且它无论如何都会被丢弃,所以它会给您错误。

在我看来,这个错误可以用更好的措辞,比如"对值类型副本的赋值不会导致底层值的赋值",因为作为一个新的程序员,当它说赋值失败是因为它不是变量时,有点令人困惑。字典是一个变量,进入的项是一个可变项,所以很难理解为什么值不是一个变量。