无法更新通用列表的内容

mun*_*nna 3 c# generics

我有一个简单的类,它有布尔字段:

public struct Foo { bool isAvailable; }
Run Code Online (Sandbox Code Playgroud)

现在我有一个foos列表:

List < Foo >  list = new List< Foo >();
Run Code Online (Sandbox Code Playgroud)

稍后,我枚举列表中的每个foo并尝试更新其isAvailable字段:

foreach(Foo foo in list) {
    foo.isAvailable = true; 
}
Run Code Online (Sandbox Code Playgroud)

但上面的代码永远不会更新列表.我在这里做错了什么,它的补救措施是什么.

Jon*_*eet 7

这是因为它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);
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试到您当前密码适应类似的短但完整的程序,它工作,那后,我们可以计算出发生了什么事情.