我有一个简单的类,其中有一个布尔字段:
public struct Foo { bool isAvailable; }
现在我有一个foo列表:
List < Foo > list = new List< Foo >();
稍后我会枚举列表中的每个foo并尝试更新其isAvailable字段。
foreach(Foo foo in list) {
foo.isAvailable = true;
}
但上述代码从未更新列表。我在这里做错了什么?有什么解决办法。
Foo
是一个可变的结构体。原始答案,当Foo是一个类时
它应该正常工作。例如,这是一个短小但完整的程序,它可以工作:using System.Collections.Generic;
public class Foo
{
public bool IsAvailable { get; set; }
public string Name { get; set; }
public override string ToString()
{
return Name + ": " + IsAvailable;
}
}
class Test
{
static void Main()
{
List<Foo> list = new List<Foo>()
{
new Foo { Name = "First", IsAvailable = true },
new Foo { Name = "Second", IsAvailable = false },
new Foo { Name = "Third", IsAvailable = false },
};
Console.WriteLine("Before:");
list.ForEach(Console.WriteLine);
Console.WriteLine();
foreach (Foo foo in list)
{
foo.IsAvailable = true;
}
Console.WriteLine("After:");
list.ForEach(Console.WriteLine);
}
}
尝试将您当前的代码调整为类似的简短但完整的程序,该程序无法正常工作,发布该程序后,我们可以找出问题所在。
Foo
,而不是类。 结构体是复制而不是引用的,因此您只修改副本而不是存储在列表中的对象。将其改为类
重新分配结果到列表中。 为此,我将使用索引进行迭代,而不是使用foreach
。
Foo
可能被声明为结构体而不是类吗? - Lucero