假设我的Awesome类有一个属性Bazinga,String默认值为"默认值",我可以去:
var enumerableOfAwesome = Enumerable
.Range(1, 5)
.Select(n => new Awesome());
foreach (var a in enumerableOfAwesome)
a.Bazinga = "New value";
Run Code Online (Sandbox Code Playgroud)
正如你可能已经意识到的enumerableOfAwesome那样,如果你希望找到你的"新价值"字符串安全隐藏在所有的中,那么再次枚举就不会让你开心Bazinga.相反,将它们输出到控制台将呈现:
默认值
默认值
默认值
默认值
默认值
从一些延迟执行的观点来看,这一切都很好,并且已经讨论过这个问题,就像这里和这里一样.然而,我的问题是为什么枚举器实现不返回不可变对象; 如果不能保证几个枚举的持久性,那么设置值的能力有什么用,除了让人们感到困惑?
也许这不是一个很好的问题,但我相信你的答案会很有启发性.
然而,我的问题是枚举器实现不返回不可变对象的原因
你怎么期望他们这样做?它们是所使用的任何类型的序列 - 你会发生什么样的事情:
var builders = new string[] { "foo", "bar" }.Select(x => new StringBuilder(x));
Run Code Online (Sandbox Code Playgroud)
?您是否期望它(在这种情况下是"它")使用相同的API自动创建一个新类型StringBuilder,但神奇地使它不可变?它如何检测突变?
基本上,你所要求的是不可行的 - 你可以有一个元素类型是可变的序列,所以在迭代它时你可以改变所产生的引用引用的对象.期待其他任何事都是不现实的,IMO.