为什么我无法修改列表项?
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成为一个类而不是一个结构,你将获得你正在寻找的行为.
归档时间: |
|
查看次数: |
1035 次 |
最近记录: |