为什么不能更新 IEnumerable<> 中元素的属性?

Why can't the properties of elements within an IEnumerable<> be updated?

我看到了这个解释无法完成的答案,但我想知道为什么

Updating an item property within IEnumerable but the property doesn't stay set?

以这段代码为例:

var MyClasses = new[] { 1, 2, 3, 4 }.Select(id => new MyClass { Id = id });

MyClass BobClass = MyClasses.FirstOrDefault(_mc => _mc.Id == 3);

BobClass.FirstName = "Bob";

Console.WriteLine("Id: {0}, FirstName: {1}", BobClass.Id, BobClass.FirstName);

foreach (var MyClass in MyClasses)
{
    Console.WriteLine("Id: {0}, FirstName: {1}", MyClass.Id, MyClass.FirstName);
}

我不明白这是怎么回事。我清楚地得到了对原始对象的引用,但这几乎就像 FirstOrDefault() 给我的只是对象的 copy 而不是引用。我可以更新副本,但它显然不会保留到原始副本,因为它们是两个完全独立的实体。

更新

哇,这很有趣:

BobClass = MyClasses.FirstOrDefault(mc => object.ReferenceEquals(BobClass, mc));

鲍勃returnsnull...?不得不说...我肯定在这里受阻了。

MyClasses 是一个 IEnumerable。这将在您每次访问它时执行。这本身并不意味着无法更新 类 之一。但是......你每次都创建 MyClass 的新实例。这些显然将具有未初始化的属性。如果你添加 .ToList() 你会得到你期望的行为。