我有此代码:
class Foo
{
public string A { get; set; }
}
class Program
{
static void Main(string[] args)
{
var strings = new List<string> { "foo", "foo" };
var list = strings.Select(x => new Foo { A = x });
foreach (var item in list)
{
item.A = "bar";
}
foreach (var item in list)
{
Console.WriteLine(item.A);
}
}
}
哪些印刷品:
foo
foo
设置item.A = "bar"
时会发生什么?
在第一个foreach循环完成后,list
var是否真的包含相同的两个Foo
对象,且"bar"
作为新字符串?
如果是这样,您如何访问这些新值?
我知道当第二个foreach循环运行时,它枚举了字符串的集合,这就是为什么要获得"foo"
的两个打印输出的原因,但是我对运行item.A = "bar"
时会发生什么感到困惑,并且如果您永远无法访问该新值,为什么编译器允许您修改它?
问题是您尚未调用ToList
方法来实现LINQ查询。当您按以下方式呼叫ToList
时:
var list = strings.Select(x => new Foo { A = x })
.ToList();
由于Foo
是类,所以item
只是对象的引用