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