6

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

我在同一个命名空间下的同一个源文件中有以下两个完全相同的结构:

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;
    }
}

以下将引发异常:

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从未使用过(这就是为什么重现错误可能不明显的原因)。

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

你知道是什么原因造成的吗?

4

1 回答 1

5

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

于 2013-09-11T03:36:13.697 回答