gpt4 book ai didi

c# - 对于带索引的嵌套选择,ImmutableArray<> 的行为不同于 Array<>

转载 作者:太空狗 更新时间:2023-10-29 23:23:17 27 4
gpt4 key购买 nike

我在 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<>正在考虑这两种结构(也许有缓存机制?)

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

最佳答案

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

关于c# - 对于带索引的嵌套选择,ImmutableArray<> 的行为不同于 Array<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18717171/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com