我创建了一个IList变量,如下所示:
IList<vertex> matrix = new List<vertex> ();
这里,顶点是我定义的一个结构,其中一个成员被访问(布尔)。
但是,当我尝试通过如下遍历列表来修改此成员时:
matrix[j].visited = false;
它出现错误,说“无法修改返回值,因为它不是变量”。知道为什么吗?
答案 0 :(得分:5)
使用vertex
索引器获取IList<T>
时,将返回值的副本。更改该副本不会更改列表 - 因此编译器会阻止您编写错误的代码。
选项:
vertex
成为一个类而不是结构。类是引用类型:列表将包含引用,稍后将通过引用显示对这些引用所引用的对象的更改。将vertex
保留为结构,但将代码更改为:
vertex v = matrix[j];
v.visited = false;
matrix[j] = v;
保持vertex
结构,但使其不可变 - 可变结构可能会导致各种问题。提供一种从现有值创建 new 值的方法,但需要进行一项特定更改。然后,您可以使用索引器对提取结果调用该方法,并使用setter设置新值:
matrix[j] = matrix[j].WithVisited(false);
我个人怀疑最后一个选项可能是最好的选择 - 顶点可能是一个自然值类型。我会强烈鼓励您开始遵循.NET命名约定 - 类型应为Vertex
且visited
可能应为Visited
。 (唯一的例外是如果此代码在vertex
类型内,并且它指的是一个字段。该字段应该是私有的,而其他代码则需要使用属性来访问该值。)