如何在.NET中修改List <T>的结构?

ser*_*hio 4 .net list

为什么我无法修改列表项?

struct Foo 
{
    public string Name;
}

Foo foo = new Foo();
foo.Name = "fooNameOne";

List<Foo> foos = new List<Foo>();
foos.Add(foo);

// Cannot modify the return value of 
// 'List<Foo>.this[int]' because it is not a variable   
//foos[0].Name = "fooNameTwo";

Foo tempFoo = foos[0];
tempFoo.Name = "fooNameTwo";

Console.WriteLine(foos[0].Name); // fooNameOne
Run Code Online (Sandbox Code Playgroud)

编辑:
我想离开Foo的结构.我该怎么办?foos[0] = tempFoo?有点复杂只是为了作业?!

Jus*_*ner 12

因为Foo是一个结构而不是一个对象.因此,它是值类型而不是引用类型.

向List添加值类型时,会生成一个副本(与列表中的条目是对原始对象的引用的引用类型不同).

从List中拉出一个实例也是如此.当你这样做时Foo tempFoo = foos[0],你实际上正在制作该元素的另一个副本,foos[0]因此你要修改副本而不是列表中的副本.

foos[0].Name = "fooNameTwo";
Run Code Online (Sandbox Code Playgroud)

出于同样的原因给你一个错误.List的索引器仍然是一个返回值的函数.由于您正在使用值类型,该函数将返回一个副本并将其存储在堆栈中供您使用.一旦您尝试修改该副本,编译器就会发现您正在做一些会产生意外结果的事情(您的更改不会反映在List中的元素中)和barfs.

正如Jon Skeet评论的那样......另一个原因是Mutable Structs是邪恶的(如果你想要更多细节,请查看这个问题:为什么可变结构是邪恶的?).

如果你让Foo成为一个类而不是一个结构,你将获得你正在寻找的行为.