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

时间:2015-11-12 22:20:02

标签: c# unity3d

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

    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。

1 个答案:

答案 0 :(得分:4)

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

修复是为了避免可变结构并改为使用类。仅使用在构造期间(其所有字段的)值固定的结构。

修改

为了进一步扩展,我们可以检查这一行:

pieceDict[pCode].pCode = pCode;

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

在我看来,错误可能更好,例如“分配给值类型的副本不会导致基础值的分配”,因为作为一个新的程序员当它说分配失败时,因为它不是一个变量有点令人困惑。字典是一个变量,进入的项目是变量,因此很难理解为什么该值不是变量。