为什么IEnumerable预测不可变?

Osk*_*erg 6 c# linq

假设我的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.相反,将它们输出到控制台将呈现:

默认值
默认值
默认值
默认值
默认值

(.NET小提琴)

从一些延迟执行的观点来看,这一切都很好,并且已经讨论过这个问题,就像这里这里一样.然而,我的问题是为什么枚举器实现不返回不可变对象; 如果不能保证几个枚举的持久性,那么设置值的能力有什么用,除了让人们感到困惑?

也许这不是一个很好的问题,但我相信你的答案会很有启发性.

Jon*_*eet 9

然而,我的问题是枚举器实现不返回不可变对象的原因

你怎么期望他们这样做?它们是所使用的任何类型的序列 - 你会发生什么样的事情:

var builders = new string[] { "foo", "bar" }.Select(x => new StringBuilder(x));
Run Code Online (Sandbox Code Playgroud)

?您是否期望它(在这种情况下是"它")使用相同的API自动创建一个新类型StringBuilder,但神奇地使它不可变?它如何检测突变?

基本上,你所要求的是不可行的 - 你可以有一个元素类型是可变的序列,所以在迭代它时你可以改变所产生的引用引用的对象.期待其他任何事都是不现实的,IMO.