我有一个简单的类,它有布尔字段:
public struct Foo { bool isAvailable; }
现在我有一个foos列表:
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);
    }
}
尝试到您当前密码适应类似的短但完整的程序,它不工作,那后,我们可以计算出发生了什么事情.