更改自变量时枚举可能不会执行异常

Enumeration may not execute exception when changing an independent variable

我最近遇到了 Foreach 语句的问题,它在更改不应影响所枚举项目的变量时抛出 Collection was modified; enumeration operation may not execute 异常,但它仍然会影响。这是我的代码,所以我可以继续我的解释:

    private static CEconTradeOffer RemoveUndesirables(CEconTradeOffer offer)
    {
        try
        {
            CEconTradeOffer returned = offer;
            foreach (CEconAsset cEconAsset in offer.ItemsToReceive)
            {
                string marketHashName = cEconAsset.GetMarketHashName(_config.ApiKey);
                if (marketHashName.ToLower().Contains("case") ||
                    marketHashName.Contains("gut") ||
                    marketHashName.Contains("falchion") ||
                    marketHashName.Contains("bayonet") ||
                    marketHashName.Contains("huntsman") ||
                    marketHashName.Contains("karambit") ||
                    marketHashName.Contains("butterfly"))
                {
                    //somehow changes both "offer" and "returned" at once.
                    returned.ItemsToReceive.Remove(cEconAsset);
                    continue;
                }

                MarketValue value = MarketHandler.GetPriceOverview(Convert.ToUInt32(cEconAsset.AppId),
                    marketHashName);
                if (!value.Success || int.Parse(value.Volume, NumberStyles.AllowThousands) <= 20)
                    returned.ItemsToReceive.Remove(cEconAsset);
            }
            return returned;
        }
        catch (Exception e)
        {
            Write.Exception(e);
            return null;
        }
    }

此功能旨在完全按照其说明进行操作;从交易报价中删除不需要的项目。如您所见,我将 CEconTradeOffer returned 设置为等于传递的名为 offer 的相同类型的参数。奇怪的是,每当我更改 returned 内部的某些内容时,它都会导致 foreach 语句中断,即使我在技术上不应该以任何方式影响 offer.ItemsToReceivereturned 是应该修改的。当我使用调试器时,我注意到 returnedoffer 都在 returned.ItemsToReceive.Remove(cEconAsset); 行发生了变化。根据我以前使用 C# 和浏览相关问题的经验,这不应该发生,因为我正在创建一个应该与 offer 分开的新变量。我试过将 returned 设置为 new CEconTradeOffer(),然后将其设置为 offer,但无济于事。在我对这个问题的研究中,我似乎只能找到人们无法在 foreach 语句而不是枚举值中创建新变量和修改它的问题。

我是否明显遗漏了什么?我不太明白为什么在 foreach 语句中创建一个单独的变量进行更改时会遇到这个特殊问题。

我没有使用多个线程,因此它不会受到其自身执行线程之外的影响。

提前致谢。

whenever I change something inside of returned it causes the foreach statement to break even though I technically shouldn't be impacting offer.ItemsToReceive in any way.

好像CEconTradeOffer是引用类型,那你赋值

CEconTradeOffer returned = offer;

你得到另一个完全相同的引用。

因此,当使用 returned.ItemsToReceive.Remove(cEconAsset) 删除项目时,它们会从同一个集合中删除,只是通过另一个引用。