无法修改IList对象的成员

Tyl*_*den 0 c# ilist

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

IList<vertex> matrix = new List<vertex> ();
Run Code Online (Sandbox Code Playgroud)

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

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

matrix[j].visited = false;
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误,说"无法修改返回值,因为它不是变量".知道为什么吗?

Jon*_*eet 5

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

选项:

  • 创建vertex一个类而不是一个结构.类是引用类型:列表将包含引用,稍后将通过引用显示对引用引用的对象的更改.
  • 保持vertex为结构,但将代码更改为:

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

    matrix[j] = matrix[j].WithVisited(false);
    
    Run Code Online (Sandbox Code Playgroud)

我个人怀疑最后一个选项可能是最好的 - 顶点可能是一个自然值类型.我强烈建议你开始遵循.NET命名约定 - 类型应该是Vertexvisited应该是Visited.(唯一的例外是如果此代码在vertex类型中,并且它指的是一个字段.该字段应该是私有的,而其他代码则需要使用属性来访问该值.)