C#ArgumentOutOfRangeException异常

标签 c# exception

我有这段代码:

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

问题是有时 List 有项目,但它没有进入“if”语句。

检查下面的调试 session 图像:

enter image description here

这怎么可能?

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

enter image description here

我的代码有什么问题还是只是一个愚蠢的错误?

更新:

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),但问题仍然存在:

lock

所以我认为这不是并发问题。

最佳答案

Debug.Assert(LayPrices.Count > 0) 放在 if 语句之前的 getter 中,您会看到 List实际上是空的。

唯一合理的解释是,您正在其他某个线程中填充列表并且存在竞争条件,或者在仅由调试器触发的属性 getter 中填充列表(您也可以在 catch 子句中填充列表调用堆栈,但我想你会自己想出来的)

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

关于C#ArgumentOutOfRangeException异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25445977/

相关文章:

c++ - 关于 RAII,C++ `try`/`catch` block 是否与其他 block 相同?

ruby - 超时::循环中的错误异常

java - java中的sleep方法是如何工作的

c# - List.ConvertAll 和异常

c# - 如何将数据表存储在缓存中以重用它?

c# - MEF:从不同的插件加载插件

c# - OpenIdConnect 重定向到 http 而不是 https

c# - 作为电子邮件附件发送后,文件卡在 w3wp.exe 中

c# - 这是什么意思 "Detected time complexity: O(Y-X)"?

exception - 您更喜欢如何组织异常定义?