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

C# 在C中创建自定义结构和访问属性的字典#,c#,unity3d,C#,Unity3d,我创建了一个定义如下的结构: public struct Piece { string pieceType; string pCode; bool dead; bool highlighted; bool specialUsed; bool moved; Material defaultMaterial; } 在一个单独的子例程中,我们创建了一个字典,它将保存这种类型的条目: Dictionary<string, Piece

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

    public struct Piece
{
    string pieceType;
    string pCode;
    bool dead;
    bool highlighted;
    bool specialUsed;
    bool moved;
    Material defaultMaterial;
}
在一个单独的子例程中,我们创建了一个字典,它将保存这种类型的条目:

Dictionary<string, Piece> pieceDict;
但是,似乎出现了一些问题,因为它不允许我访问新条目的各个属性。获取此错误:

 Cannot modify the return value of 'Dictionary<string, Piece>.this[string]' because it is not a variable
无法修改“Dictionary.this[string]”的返回值,因为它不是变量
我已经看了文档,无法找出哪里出了问题,因此任何帮助都将不胜感激


我正在使用UnityEngine。

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

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

编辑

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

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


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

您使用的是可变结构,请将其改为类,这是一个传递值问题。哇。。。这几乎解决了所有问题。花了好几个小时试图解决这个问题。谢谢如果你能在回答中向其他用户解释这一点,我会接受的。另外,我收到一条警告,说字典从未被分配给其他用户。我添加的内容有误吗?请确保您在某个地方创建了一个新的副本,例如
Dictionary pieceDict=new Dictionary()
。为应对语言的变化干杯,但您已经得到了很多帮助。
pieceDict[pCode].pCode = pCode;