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