c#ArgumentOutOfRangeException

我有这段代码:

    private List<...> LayPrices;
    public Decimal BestLayOdds
    {
        get
        {
            if (LayPrices.Count > 0)
            {
                return LayPrices[0].dOdds;
            }
            return 1000.0M;   
        }
    }

问题是有时List有项目,但它不会进入’if’语句.

检查调试会话的以下图像:

这怎么可能呢?

但是如果我强制它返回第一个项目,在最后一个return语句中,即使列表中有元素,我也会得到一个ArgumentOutOfRangeException.检查嵌套图像:

我的代码有什么问题,或者它只是一个愚蠢的错误?

更新:

LayPrices列表仅在类构造函数上实例化:LayPrices = new List< PriceStruct>();.

它只是在一个方法上填充了项目,其中包含以下代码:

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

并发问题和线程是我的第一个线索,所以我确实放了一个锁(LayPrices),问题仍然存在:

所以我认为这不是一个并发问题.

最佳答案 将Debug.Assert(LayPrices.Count> 0)放在if语句之前的getter中,你会发现List实际上是空的.

唯一合理的解释是你在一些其他线程中填充列表并且你有竞争条件或者只在调试器中触发的属性getter(你也可以在callstack中的catch子句中填充列表但是我想你会自己想出来的)

为了获得更好的答案,请包含填充列表的所有代码.不仅您认为应该运行的代码,还有从列表中添加或删除项目的所有属性,构造函数或方法.

点赞