首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于带有索引的嵌套选择,ImmutableArray<>的行为与Array<>不同

对于带有索引的嵌套选择,ImmutableArray<>的行为与Array<>不同
EN

Stack Overflow用户
提问于 2013-09-10 11:01:11
回答 1查看 543关注 0票数 6

我在ImmutableArray<>中遇到了一个似乎非常奇怪的错误(使用BCL不变集合v1.0.12.0,运行时.NET 4.5):

在同一个名称空间中,有两个完全相同的结构位于同一个源文件中:

代码语言:javascript
复制
public struct WeightedComponent {
    public readonly IComponent Component;
    public readonly decimal Weight;

    public WeightedComponent(IComponent component, decimal weight) {
        this.Component = component;
        this.Weight = weight;
    }
}

public struct WeightedComponent2 {
    public readonly IComponent Component;
    public readonly decimal Weight;

    public WeightedComponent2(IComponent component, decimal weight) {
        this.Component = component;
        this.Weight = weight;
    }
}

以下将引发异常:

代码语言:javascript
复制
var elements1 = new[] { 1, 2, 3 }.Select(wc => new WeightedComponent(null, 0)).ToImmutableArray();
var foo = elements1.Select((e1, i1) => elements1.Select((e2, i2) => 0).ToArray()).ToArray();
if (foo.Length != 3) throw new Exception("Error: " + foo.Length); //Error: 1

var elements2 = new[] { 1, 2, 3 }.Select(wc => new WeightedComponent2(null, 0)).ToImmutableArray();
var foo2 = elements2.Select((e1, i1) => elements2.Select((e2, i2) => 0).ToArray()).ToArray();
if (foo2.Length != 3) throw new Exception("Error: " + foo.Length);

如果我将elements1投影到第一行的ToArray()中,而不是ToImmutableArray(),那么一切都很好。

这两个结构之间唯一的区别是,代码以前广泛使用WeightedComponent,而以前从未使用过WeightedComponent2 (这就是为什么重现bug可能并不明显的原因)。

在同一个表达式中迭代elements1两次似乎与问题有关,好像我删除了它-- Select工作得很好,但是elements2没有这样的问题。这似乎真的与ImmutableArray<>背后的代码考虑这两种结构的方式有关(也许有缓存机制?)

你知道是什么导致的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-11 03:36:13

这是由于首次枚举集合的空实例时触发的ImmutableArray<T>枚举器中的错误。NuGet包的未来版本将修复这个问题。同时,我强烈建议您避免使用ImmutableArray<T>

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18717171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档