c#ArgumentOutOfRange异常
我有一段代码:c#ArgumentOutOfRange异常,c#,exception,C#,Exception,我有一段代码: private List<...> LayPrices; public Decimal BestLayOdds { get { if (LayPrices.Count > 0) { return LayPrices[0].dOdds; } return 1000.0M;
private List<...> LayPrices;
public Decimal BestLayOdds
{
get
{
if (LayPrices.Count > 0)
{
return LayPrices[0].dOdds;
}
return 1000.0M;
}
}
并发性问题和线程是我的第一条线索,因此我设置了锁(LayPrices),问题仍然存在:
因此,我认为这不是并发问题。将Debug.Assert(LayPrices.Count>0)
放在if
语句前面的getter中,您将看到列表实际上是空的
唯一合理的解释是,您正在填充列表,或者是在其他线程中,并且您有一个争用条件,或者是在一个仅由调试器触发的属性getter中(您也可以在调用堆栈的catch子句中填充列表,但我想您应该自己已经解决了这个问题)
为了得到更好的答案,请包含所有填充列表的代码。不仅是您认为应该运行的代码,还有所有在列表中添加或删除项的属性、构造函数或方法。我发现了问题所在。
这确实是并发性问题,尽管我没有显式地使用线程,但我使用事件,并且我认为事件处理是同步的(是同步的吗?)
如果我在阅读或添加到列表的任何地方添加锁,问题就会消失。如何实例化和填充LayPrices
?有线程吗?要么我遗漏了什么,要么我们无法从您的代码中看到问题。你能再加上最低价格的设定吗?(或显示它被修改/实例化的每个地方)。LayPrices从何处获取输入?在上面的代码中,LayPrices对象未初始化。是否有任何属性获取程序设置或填充Visual Studio调试器可能正在评估的LayPrices
?如果一切正常,请清理解决方案并重新生成它。有时它解决了问题。我做到了,你是对的!断言失败,因为列表实际上是空的。现在我必须弄清楚为什么调试告诉我它不是。谢谢你的帮助。
LayPrices.Clear();
foreach (PriceSize priceSize in exchangePrices.availableToLay)
{
PriceStruct lay = new PriceStruct();
lay.dOdds = (Decimal)priceSize.price;
lay.dAmount = (Decimal)priceSize.size;
LayPrices.Add(lay);
}