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