1

我创建了一个 IList 变量,如下所示:

IList<vertex> matrix = new List<vertex> ();

在这里,顶点是我定义的一个结构,其中一个成员被访问(布尔值)。

但是,当我尝试通过遍历以下列表来修改此成员时:

matrix[j].visited = false;

它给出了一条错误消息“无法修改返回值,因为它不是变量”。知道为什么吗?

4

1 回答 1

5

当您vertex使用IList<T>索引器获取时,这将返回该值的副本。更改该副本不会更改列表 - 因此编译器会阻止您编写不正确的代码。

选项:

  • 创建vertex一个类而不是一个结构。类是一种引用类型:列表将包含引用,并且这些引用所引用的对象的更改将在以后通过引用可见。
  • 保留vertex为结构,但将代码更改为:

    vertex v = matrix[j];
    v.visited = false;
    matrix[j] = v;
    
  • 保留vertex结构,但使其不可变 - 可变结构会导致各种问题。提供一种从现有值创建新值的方法,但要进行特定更改。然后,您可以在使用索引器获取的结果上调用该方法,并使用 setter 设置新值:

    matrix[j] = matrix[j].WithVisited(false);
    

我个人怀疑最后一种选择可能是最好的选择——顶点很可能是一种自然值类型。不过,我强烈建议您开始遵循 .NET 命名约定 - 类型应该是Vertex并且visited可能应该是 .NET 命名约定Visited。(一个例外是如果此代码在vertex类型内,并且它引用一个字段。该字段应该是私有的,而其他代码将需要使用属性来访问该值。)

于 2013-10-16T15:54:56.127 回答