在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。
结构是值类型,当您传递结构时,它会创建结构的副本。这尤其是可变结构的问题,因为当您将结构传递给方法(或从属性中获取)时,结构会按值复制,然后您修改的是副本,而不是原始副本。
解决方法是避免使用可变结构,而是使用类。在构造过程中,仅在(其所有字段的)值固定的情况下使用structs。
编辑
为了对此进行一点扩展,我们可以检查以下行:
pieceDict[pCode].pCode = pCode;
这里发生的情况是,第一部分pieceDict[pCode]
返回值的副本(在值类型的情况下),然后由.pCode
部分操作,您将其分配给pCode
,但因为您正在处理副本,而不是存储在字典中的内容,所以它将不会保存。编译器足够聪明,可以注意到您正在尝试分配给它,而且它无论如何都会被丢弃,所以它会给您错误。
在我看来,这个错误可以用更好的措辞,比如"对值类型副本的赋值不会导致底层值的赋值",因为作为一个新的程序员,当它说赋值失败是因为它不是变量时,有点令人困惑。字典是一个变量,进入的项是一个可变项,所以很难理解为什么值不是一个变量。