【问题标题】:Unable to modify IList object's members [duplicate]无法修改 IList 对象的成员 [重复]
【发布时间】:2013-10-24 20:07:59
【问题描述】:

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

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

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

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

matrix[j].visited = false;

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

【问题讨论】:

  • vertex 是一个结构。将其更改为class。如果您想要可变数据结构,请不要使用 struct
  • 谢谢。有效。我不知道。感谢您提供的信息。
  • @SriramSakthivel:虽然这很可能不是正确的方法。顶点类型作为不可变值类型可能会更好。
  • @JonSkeet 但是.. OP 想要变异 :)
  • @SriramSakthivel:OP 想要突变的效果。这并不意味着类型必须是可变的......

标签: c# ilist


【解决方案1】:

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

选项:

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

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

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

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

【讨论】:

  • 乔恩,无需假设 OP 声明它顶点是一个结构
  • @SriramSakthivel:没错,没有发现。将删除第一句话。
猜你喜欢
  • 1970-01-01
  • 2020-11-23
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 2012-09-05
  • 1970-01-01
相关资源
最近更新 更多